<h2>The Anchor, With $friend.name</h2>
<<set _settle = [
"Marie sets two pints down without being asked, the way she does for the regulars, and $friend.name slides one across to you. The first one goes down mostly in silence, the comfortable kind. By the second, the talk has found its own way in.",
"$friend.name gets the round before you can reach for your wallet, waving you off like the gesture offends him. You take the stools at the quiet end, away from the jukebox, and settle in. It isn't long before the conversation is going on its own.",
"You carry the pints over and $friend.name shifts his coat off the spare stool to make room. The bar is warm and low-lit and in no hurry, and neither are you. A few mouthfuls in, the easy back-and-forth starts up the way it always has."
]>>
<<= _settle.random()>>
<br><br>
<<switch $friend.topic>>
<<case "old">>
<<speech "You" $name>>
You remember freshman year? Splitting one pitcher four ways because that's all anyone had, and still strutting around like we owned the whole town.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Four guys, one warm pitcher, and we felt like the kings of college. I've got more in the bank now than I know what to do with, and I swear I have never felt as rich as I did broke on that porch. You think we'll ever feel freedom like that again?
<</speech>>
<<speech "You" $name>>
Sure hope so, dude. We gotta have hope.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Long time ago, man. Half those guys I couldn't tell you where they ended up. You and me were the only two who actually rolled the dice on anything. That counts for something. I think it does, anyway.
<</speech>>
<</if>>
<<case "startup">>
<<speech "You" $name>>
I still run the old company back through my head some nights. The parts I'd do differently.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
'Course you do. I did the same thing after I sold mine, just from the winning side, which is its own kind of haunted. The gap between your ending and my ending is luck and timing, dude. Anybody who tells you it's genius is selling something. You stepped up and swung. Most of the guys we knew never even got out of the dugout.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Yeah, well. I cashed out of mine before it could turn on me, and I'm not gonna stand here and pretend that was all me being smart. Could've gone the other way. Could've been my turn to lose the house. Buy you a beer either way, man.
<</speech>>
<</if>>
<<case "work">>
<<speech "You" $name>>
What are you even doing these days? Still "advising," whatever that's supposed to mean?
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Advising. Investing. Telling founders no, mostly. Honestly? Bored out of my skull half the time. I hit the number, and then it turns out nobody tells you what you're supposed to do once you've hit it. You still want something. You've got no idea how much I miss wanting something.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
I write checks, I take meetings, I golf more than any grown man should. It's a good problem, I'm not crying into my beer about it. But you'd have hated it, the boredom of it. You always needed the fight more than the money.
<</speech>>
<</if>>
<<case "ashley">>
<<speech "You" $name>>
Me and $wife.name are... I don't know, man. We're trying. Some days it's mostly just the trying.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Okay, I'm gonna say one dumb thing and then I'm gonna be serious, 'cause you know I love you. $wife.name is still an absolute smokeshow and a guy like you has no business waking up next to a rack like that. There. Out of my system.
<</speech>>
<<speech "Friend" $friend.name>>
Now the real part. She stayed. Through all of it, the money, the company, all of it, she stayed, and I watched her do it up close. That woman is the best thing that ever happened to you, full stop. Whatever you're doing to fix it, do more of it.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
She's out of your league, brother, always has been, and I say that with nothing but love. She stuck around through the absolute worst of you. Repair that shit between you guys. That's all I've got. I move money around, I don't fix marriages.
<</speech>>
<</if>>
<<case "sports">>
<<speech "You" $name>>
You catch the game?
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Do not get me started. Blew a fourteen-point lead in the fourth. Our guys, our actual school, on national TV, in front of God and everybody. I aged a full year watching it. You and me were never built for hope, man. We should know that by now.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Caught the back half in here. These guys were hollering about it, same faces, same hot takes every week. You forget what it's like, talking to people who've known you longer than five minutes.
<</speech>>
<</if>>
<<case "checkin">>
<<speech "You" $name>>
I'm doing alright, you know. In case you were wondering.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
I wasn't wondering, I was watching. Those are different things. You're carrying it better than you were six months ago, I'll give you that much. Just don't go dark on me again. You do not have to be winning to pick up the phone. That was never the deal between us.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Yeah, you keep saying that. Said it for about three years straight while you went under, and all I ever got back was voicemail. I'm not busting your balls. I'm just telling you the line's open. Always was. You're the one who keeps forgetting it.
<</speech>>
<</if>>
<<case "cheat_ons">>
<<speech "You" $name>>
That girl I took home from here. I shouldn't have. But God, $friend.name, she was so damn hot, and me and $wife.name hadn't... I don't know. I keep finding new ways to make it not my fault.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Hey, you're talking to the wrong priest, brother. My hands aren't clean either. There was one a few months back, I was out of town, and she was... unreal, man. And I swear I had the whole excuse written in my head before I'd even crossed the lobby. Different city, so it doesn't count. Like there's a border on it.
<</speech>>
<<speech "Friend" $friend.name>>
And this is the part I only say to you. I knew. Every second of it, I knew exactly what I was doing, and I did it anyway, and I started blaming her for being that hot before I'd even touched her. So do you. We're not confused men, you and me. We just love pretending we are.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
She was hot, right? So what's the actual problem. You didn't fall in love, you didn't move her into the guest room. Guys like us have got a lot of want and only one life, and I'm not about to sit here and act like I'm any better. You enjoy it, you regret it, and now just forget it. Pretend like it never happened and eventually you'll believe it.
<</speech>>
<</if>>
<<case "cheat_sw">>
<<speech "You" $name>>
That thing down by the canal. The... you know. Honestly, I don't even count it. There's no feelings in it, $friend.name. It's basically just a fancier way of jerking off.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Yeah. I've run that exact line on myself, word for word. No feelings, it's a transaction, it's self-care with a co-pay. It's incredible what a man can talk himself into around one in the morning.
<</speech>>
<<speech "Friend" $friend.name>>
But you and me both know if $wife.name found out, "there were no feelings involved" is not the sentence that walks you out of that room. We know right where the line is, man. We just stand on the wrong side of it and squint until we can't see it.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Nah, that's different, you're right. No numbers exchanged, no second date, nobody's heart's in it. It's a service, you paid for it, it's done. I tell myself the same thing and I sleep just fine. You want a clean conscience, that's sold somewhere else.
<</speech>>
<</if>>
<<case "sw_suggest">>
<<speech "Friend" $friend.name>>
Okay. Dangerous idea, stop me if I'm out of line. That woman who works the towpath down by the canal. It's early enough, and I'm drunk enough, and you've got that look you get. Two grown men, a cab, a thing we both agree never happened.
<</speech>>
<<speech "You" $name>>
$friend.name. Christ.
<</speech>>
<<speech "Friend" $friend.name>>
I'll cover the cab. I'm not covering your half of the rest, I'm rich, not a charity. When did you last do something you'd actually have to lie about? ...Bad example. When did you last do a fun one?
<</speech>>
<</switch>>
<<if $friend.topic === "sw_suggest">>
<br>
<<if $money >= 75>>
<<link "Split a cab to the canal and go find her. ($75)" "Canal SW Friend">>
<<set $money -= 75>>
<<set $arousal = Math.max($arousal - 10, 0)>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $friend.relationship += 1>>
<</link>>
<<else>>
//$friend.name is already eyeing the door for a cab, but your share would be $75 and you're short. He's generous, not that generous.//
<</if>>
<br>
<<link "Laugh him off and call it a night." $return>><</link>>
<<else>>
<br>
<<link "Get the next round in, then head off." $return>><</link>>
<</if>><h2>Her Place</h2>
<<set $onsEver = true>>
<<if not $ex.live and random(1, 100) <= 60>>
<<set $ex.live = true>>
<<set $ex.saved = false>>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
<<set $ex.scares = 0>>
<</if>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<sexEnergy 1>>
<<set _gifs = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _gifs.push("ons" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/ons/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"Her flat feels like a stranger’s place, the furniture and the scent of her life pressing in from every side, but the booze keeps your head quiet. You shove her against the hallway wall the second the door clicks shut. Your hands yank her dress up, fingers hooking her panties aside as you free your cock and slam into her wet pussy in one rough thrust. She gasps, legs wrapping around you, and you fuck her hard against the wall, hips snapping, balls slapping her ass with every deep plunge. Her cunt grips you tight, slick and hot, and you pound her until your thighs burn. Afterward she is already half asleep, and you find your clothes in the dark.",
"You barely register the room around you. Her breath tastes like whiskey when your mouths crash together. You shove her onto the unfamiliar bed, yank her jeans and panties down in one motion, then drive your cock straight into her soaked pussy. She moans and spreads wider as you slam into her, the mattress creaking under every brutal thrust. She claws at your back, pulling you harder into her cunt. You flip her onto her stomach, grip her hips, and fuck her from behind, burying yourself to the hilt again and again. Her pussy milks your cock as she comes, and you follow right after. When you finally pull out she is already drifting off, the sheets damp beneath her. You find your clothes in the dark and dress without looking back."
]>>
<<= _scene.random()>>
<br><br>
<<link [[Slip out and head home.|Living Room]]>><</link>><h2>The Anchor</h2>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set _barImg = "images/characters/npc/bar" + random(1, 7) + ".jpeg">>
<<set _approach = [
"You carry your drink down the bar before the nerve goes, and find a line that isn't quite as smooth as it sounded in your head. She lets you finish it anyway.",
"You take the stool beside her and say something. She turns, looks you over without hurry, and decides whether you're worth the next five minutes.",
"You go over. The opener is nothing special, but she laughs, or is kind enough to, and for a moment the night could go either way."
]>>
<div class="intro-image">
<img @src="_barImg" width="100%">
</div>
<br>
<<= _approach.random()>>
<br><br>
/* Success roll. base + fitness + a drunkenness sweet spot peaking at $drunk 3
+ a little job-level swagger. Tune any of the four freely. */
<<set _chance = Math.max(5, Math.min(90,
10
+ ($fitnessTier * 8)
+ (20 - (Math.abs($drunk - 3) * 7))
+ (($job.level - 1) * 3)
))>>
<<if random(1, 100) <= _chance>>
<<set _win = [
"Whatever you said, it lands. The talk runs easy and the drinks keep coming. At some point you set your glass down and ask whether you should walk her home. She is down.",
"After a few drinks, she leans in closer than the noise strictly requires. When she says her place is two streets over, it isn't really a question, and you're already reaching for your coat."
]>>
<<= _win.random()>>
<br><br>
<<link "Go with her." "Anchor ONS">>
<<set $onsToday = true>>
<</link>>
<<else>>
<<if $drunk >= 6>>
<<set _lose = [
"The words slur heavier than you mean them to, and she watches you find the end of the drunken sentence with the patience of someone already deciding against it. She's gone to find her friends before you've quite landed the point.",
"You're drunker than you'd let yourself believe, and she can see it. She's polite about it, pats your arm like out of friendly pity, and turns back to the bar."
]>>
<<else>>
<<set _lose = [
"It just doesn't catch. She's friendly enough, gives you a couple of minutes, then her attention drifts back to her phone in the way that means the door is closed.",
"She clocks the pale band on your finger, or maybe just the married look that comes off you whether the ring is there or not, and the warmth goes out of it. She wishes you a good night and means goodbye."
]>>
<</if>>
<<= _lose.random()>>
<br><br>
<<link "Back to your drink." $return>><</link>>
<</if>><h2><<print passage()>></h2>
<<if $wife.location == "bathroom" and !($wife.relationship >= 25 or ($wife.mood >= 1 and $wife.relationship >= 0))>>
<<include 'Bathroom, Eject'>>
<<else>>
<<include 'Bathroom, Description'>>
<<include 'Bathroom, Triggers'>>
<<include 'Bathroom, Basics'>>
<<include 'House, Transport'>>
<</if>><h2>Bathroom Door</h2>
The door is shut. You can hear water moving on the other side.
<br><br>
''What do you do?''
<br>
<<if $wife.relationship >= 25 or ($wife.mood >= 1 and $wife.relationship >= 0)>>
<<link "Knock and step inside." "Bathroom">><</link>>
<<else>>
<<link "Knock and ask to come in." "Bathroom Refused">>
<<moodShift -1 -1>>
<</link>>
<</if>>
<br>
<<if !$wife.spiedToday>>
<<link "Try to peek through the gap." "Bathroom Spy">><</link>>
<<else>>
//You've already pushed your luck once today.//
<</if>>
<br>
<<link "Leave her be." $return>><</link>><h2>Bathroom Door</h2>
You knock. There's a pause, then her voice through the door, low and tight.
<br><br>
<<speech "Wife" $wife.name>>
Just give me five minutes. Please.
<</speech>>
<br><br>
<<link "Step away." $return>><</link>><h2>Bathroom Door</h2>
You ease toward the door and angle yourself to the narrow gap by the hinge.
<br><br>
<<set $wife.spiedToday = true>>
<<set _catchChance = Math.max(25, Math.min(90, 45 - $wife.mood * 15))>>
<<if random(1, 100) <= _catchChance>>
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
You catch a glimpse through the gap. Bare skin slick with water, the curve of her back as she rinses her hair. Then the latch shifts under your weight and gives you up. She turns sharply, sees you, and her face goes hard. <span class="arousal">Arousal increased.</span>
<br><br>
<<speech "Wife" $wife.name>>
Are you serious right now? What is wrong with you?
<</speech>>
</div>
</div>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<moodShift -2 -3>>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
For a moment you watch unnoticed. The line of her shoulder, the curve of her hip, steam rising off the tile, water tracing every inch of her skin. Then a board creaks under your foot and you ease back before she turns. <span class="arousal">Arousal increased.</span>
</div>
</div>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<</if>>
<<link "Step away." $return>><</link>>/* Shower */
The shower waits behind a thin curtain, the water always taking a moment to warm up.
<br>
<<if $time >= $timeMax>>
//It's too late in the day for a cold shower.//
<<elseif $arousal >= 3>>
<<link "Take a cold shower to clear your horny head a bit." $return>>
<<set $arousal = Math.max($arousal - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<</link>>
<<else>>
//Clear-headed enough. A shower can wait.//
<</if>>
<<soloVent "bathroom">>/* Base description */
A small bathroom with a shower over the tub, a sink set into a narrow vanity, and a mirror that has seen better days. Tile runs halfway up the walls, the grout a shade darker than it should be in the corners. The window above the toilet is frosted glass, letting through only a vague suggestion of the world outside.
/* Time */
<<switch $time>>
<<case 0>>Early morning light filters dimly through the frosted window, the tile cool underfoot.
<<case 1>>Late morning brings a softer light through the window, the air still damp from the morning's first shower.
<<case 2>>Midday settles into the bathroom, quiet apart from the slow drip of the tap.
<<case 3>>Afternoon barely reaches in, the room dim and a little stale.
<<case 4>>Late afternoon leaves the bathroom in half-light, the mirror catching the lamp from the corridor.
<<case 5>>Early evening dims the room further, only the hallway light pushing in from outside.
<<case 6>>Evening leaves the bathroom in shadow until you flick the switch, the bulb humming briefly before steadying.
<<case 7>>Late evening turns the room small and contained, the world reduced to the hum of pipes and the rim of light around the door.
<<case 8>>Night fills the bathroom completely, the tiles cold under your feet.
<</switch>>
<br><br><<include 'Bathroom, Description'>>
$wife.name pushes the door open and stops short when she sees you still in here. Her jaw sets.
<br><br>
<<speech "Wife" $wife.name>>
Out. I'd like a minute to myself.
<</speech>>
<br><br>
<<moodShift -1>>
<<link [[Step out.|Living Room]]>><</link>><<if $wife.location == "bathroom">>
<<if $wife.relationship >= 50 and $wife.mood >= 1>>
/* SHOWER tier - she lets you see her naked */
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 2>>
$wife.name is in the shower, the curtain pulled half open. She catches your eye through the steam and doesn't bother covering up.
<<else>>
$wife.name is in the shower, water tracing down her skin. She glances over when you come in but doesn't reach for the curtain.
<</if>>
<<if not $wife.bathroomViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if !$wife.bathroomViewedToday>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set $wife.bathroomViewedToday = true>>
<</if>>
<<elseif $wife.relationship >= 25 and $wife.mood >= 0>>
/* TOWEL tier - drying after a bath */
<div class="char-scene">
<img @src="either('images/characters/w/w_towel1.jpeg', 'images/characters/w/w_towel2.jpeg', 'images/characters/w/w_towel3.jpeg', 'images/characters/w/w_towel4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is drying herself after a bath, skin still pink from the heat. She catches your reflection and gives you a small look but keeps working the towel.
<<else>>
$wife.name is drying herself after a bath, the towel moving in slow, distracted strokes. She doesn't look up when you come in.
<</if>>
<<if not $wife.bathroomViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if !$wife.bathroomViewedToday>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $wife.bathroomViewedToday = true>>
<</if>>
<<else>>
/* CLOTHED tier - fully dressed routine */
<div class="char-scene">
<<if $time <= 1>>
<img @src="'images/characters/w/w_sleepwearBathroom1.jpeg'" class="char-img">
<<else>>
<img @src="either('images/characters/w/w_casualBathroom1.jpeg', 'images/characters/w/w_casualBathroom2.jpeg')" class="char-img">
<</if>>
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is at the mirror, going through her routine. She meets your eye in the glass.
<<elseif $wife.mood == 0>>
$wife.name is at the mirror, going through her routine.
<<else>>
$wife.name is at the mirror, her eyes fixed on her reflection, jaw set.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<</if>>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "bathroom">><h2><<print passage()>></h2>
<<include 'Bedroom, Description'>>
<<include 'Bedroom, Triggers'>>
<<include 'Bedroom, Basics'>>
<<include 'House, Transport'>>/* Bed */
The bed rests against the wall, its presence steady and familiar.
<br>
<<if $time >= 6>>
<<link 'Sleep until tomorrow.' "Sleep">><</link>>
<<else>>
//It's too early to sleep.//
<</if>>
<<soloVent "bedroom">>
<br><br>
/* Desk */
<<if $items.pc>>
A small desk holds your computer, the screen dark for now.
<br>
<<link [[Use the computer.|Computer]]>><</link>>
<<else>>
A small desk sits against the wall, its surface mostly clear, a chair tucked in beneath it.
<br>
//If you had a computer, you could set it up here.//
<</if>>/* Base description */
A simple bedroom with a double bed against the main wall. Two bedside tables sit on either side, with a wardrobe and chest of drawers providing basic storage. A reading lamp rests within reach of the bed, and curtains cover the window.
/* Time description */
<<switch $time>>
<<case 0>>Early morning light filters in softly, carrying the promise of a new day.
<<case 1>>Late morning light settles into the room, steady and unhurried.
<<case 2>>Midday arrives plainly, the room evenly lit and still.
<<case 3>>Afternoon drifts through, quiet and unremarkable.
<<case 4>>The late afternoon slants through the curtains, the light beginning to soften.
<<case 5>>Early evening warms the room, shadows lengthening across familiar surfaces.
<<case 6>>Evening settles in, the room quiet and the day giving way to its slower hours.
<<case 7>>Late evening dims the room, lamps casting soft pools of light against the dark.
<<case 8>>Night settles fully, the room dark and withdrawn from the world outside.
<</switch>>
/* Chore State */
<<if $chores.bedroom>>
<span class="good">The room is tidy and in order.</span>
<<else>>
<span class="warning">The bed is unmade, and a few things have been left out of place.</span>
<</if>>
/* Bedroom Chore */
<<chore "bedroom" "Tidy the bedroom.">>
<br><br>/* Fitness Feedback */
<<fitnessFeedback>>
/* Wife is here */
<<if $time == 7>>
<<intimacyReady>>
<<if $wife.lingerieNightDay > 0 and $gameDay >= $wife.lingerieNightDay
and $wife.relationship >= 40 and $wife.mood >= 1
and _ready and not $wife.intimacyToday
and $gameDay >= $intimacyUnlockDay and not $wife.cycleOff>>
<<goto "Wife Lingerie Night">>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearBedroom1.jpeg', 'images/characters/w/w_sleepwearBedroom2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is here, getting ready for bed. She catches your eye in the mirror.
<<elseif $wife.mood == 0>>
$wife.name is here, getting ready for bed.
<<else>>
$wife.name is here, going through her routine without looking at you.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<</if>>
<<elseif $time == 8>>
<<if $wife.wardrobeMalfunction>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearMalfunction1.jpeg', 'images/characters/w/w_sleepwearMalfunction2.jpeg','images/characters/w/w_sleepwearMalfunction3.jpeg','images/characters/w/w_sleepwearMalfunction4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood <= -1>>
$wife.name is asleep, turned away from you. The blanket has slipped and her nightclothes have shifted up and she is unknowingly flashing her breasts. She'd probably be even more annoyed if she knew how you stood and took in the sight.
<<else>>
$wife.name is asleep, her breathing slow and steady. The blanket has slipped and her nightshirt has shifted up showing her breasts. You admire them for a while.
<</if>>
<<if not $wife.wardrobeSeen>> <span class="arousal">Arousal increased.</span><</if>>
</div>
</div>
<<if not $wife.wardrobeSeen>>
<<set $wife.wardrobeSeen = true>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<</if>>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearSleeping1.jpeg', 'images/characters/w/w_sleepwearSleeping2.jpeg','images/characters/w/w_sleepwearSleeping3.jpeg','images/characters/w/w_sleepwearSleeping4.jpeg','images/characters/w/w_sleepwearSleeping5.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood <= -1>>
$wife.name is asleep, turned away from your side of the bed.
<<else>>
$wife.name is asleep, her breathing slow and steady.
<</if>>
</div>
</div>
<</if>>
<<elseif $weekday >= 6 and $time == 0>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearBedroom1.jpeg', 'images/characters/w/w_sleepwearBedroom2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is still in bed, relaxed in the soft morning light. She shifts to make room when you come in.
<<elseif $wife.mood == 0>>
$wife.name is still in bed, relaxing in the soft morning light.
<<else>>
$wife.name is still in bed, turned away from the door, the blanket pulled up high.
<</if>>
<<if $wife.mood >= 0 and not $wife.lazyMorningToday>>
<br>
<<link "Crawl back in beside her for a while." "Lazy Morning">><</link>>
<br>
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "bedroom">><h2>Lower Hill Boxing Club</h2>
A converted warehouse off the canal, the sign above the door faded to a ghost of itself. Inside it smells of sweat, old leather, and the kind of disinfectant that doesn't fool anyone. A ring takes up the center, heavy bags hang in two rows along the wall, and a couple of regulars are usually working a rhythm on the speed bags. The owner, a thickset man called Vance, runs the place more out of stubbornness than profit.
<<switch $time>>
<<case 0>>Early morning. A handful of older men are already here, working their rounds in silence. The radio is on low.
<<case 1>>Late morning. The place is quiet, just Vance behind the counter and one kid hitting the heavy bag with more anger than technique.
<<case 2>>Midday. The lunch crowd, such as it is. A few office shirts on hangers by the changing room door.
<<case 3>>Early afternoon. Quiet again. Vance is on a phone call he isn't enjoying.
<<case 4>>Late afternoon. The after-work rush is starting, the bags all in use, the air heavier already.
<<case 5>>Early evening. The place is busy. The smell is rich. Somebody on the bag has good form and is making sure everyone knows it.
<<case 6>>Evening. Last classes are wrapping up. Vance is rolling down the shutters at the front.
<<case 7>>The shutters are down. The club is closed.
<<case 8>>The club is closed.
<</switch>>
<br><br>
<<if $time >= 7>>
//The club is closed for the night.//
<<else>>
A session costs $15.
<br>
<<workout "Pay for a session and train hard." 2 1 3 15>>
<</if>>
/* Saturday bareknuckle fighting */
<<if $weekday == 6 and ($time == 5 or $time == 6)>>
<br><br>
The ring in the center is roped off and the heavy bags shoved back against the walls. There's a bareknuckle card tonight, the kind Vance doesn't advertise and the police don't drop in on. A crowd is already thickening around the ropes.
<br>
<<if $fitnessTier >= 1 and not $foughtToday and $energy >= 3>>
Vance leans in, voice low. //"Bare fists, no names, cash to the man left standing. You want in?"//
<br>
<<link "Enter the card." "Boxing Fight">><</link>>
<br>
<<elseif $fitnessTier < 1>>
//Vance shakes his head before you ask. You're not stepping in there in the shape you're in. But you can watch.//
<br>
<<elseif $foughtToday>>
//You've already left it all in the ring tonight. One card is enough.//
<br>
<<elseif $energy < 3>>
//You're dead on your feet. No fighting tonight, but you can stand at the ropes.//
<br>
<</if>>
<<link "Watch from the crowd." "Boxing Spectate">><</link>>
<</if>>
<br><br>
<<link [[Back out to the canal.|Canal Path]]>><</link>><h2>The Ring</h2>
<<set $foughtToday = true>>
<<addWorry 2>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<div class="intro-image wide">
<img @src="either('images/scenes/boxing/boxing_pov1.jpeg', 'images/scenes/boxing/boxing_pov2.jpeg')" width="100%">
</div>
<br>
/* Win chance scales with conditioning. Tune the 25 and 13. */
<<set _winChance = 25 + $fitnessTier * 13>>
<<set _won = (random(1, 100) <= _winChance)>>
<<if _won>>
<<set _purse = 50 + $fitnessTier * 25 + random(0, 20)>>
<<set $money += _purse>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $fitness += 2>>
<<set _winText = [
"The crowd packs in around the ropes, cigarette smoke and money already moving in folded handshakes. Your opponent is bigger and slower, and somewhere in the second round you find the old rhythm, the one that lived in your hands before the weight and the desk. You put him down on the canvas, and Vance counts the bills into your palm before you've got your breath back.",
"No gloves, no headgear, no scorecard, just two men and a crowd that paid to watch one of them fold. Your hands are wrecked by the end and your face will tell the story for a week, but you read him early and you drop him. The man with the bag pays out without meeting your eye."
]>>
<<= _winText.random()>>
<br><br>
<span class="good">You won the bout. Purse: $<<print _purse>>.</span>
<<else>>
<<set _purse = 15>>
<<set $money += _purse>>
<<set $energy = Math.max($energy - 4, 0)>>
<<set $fitness += 1>>
<<moodShift -1>>
<<set _lossText = [
"Bare knuckles punish the rusty, and the rust on you is realer than you let yourself believe. You catch one clean punch to chin and the lights swim and the canvas comes up to meet you. You last longer than the crowd expected though not as long as you needed to. Vance presses a few bills into your hand out of something like pity and tells you to ice the hand.",
"Your opponent is younger, hungrier, and he has done this more recently than you. Without gloves and headgear there's nowhere to hide, and he finds your face again and again until the round saves you. You stay upright to the end, which is the most that can be said. A thin fold of show money, and a walk home you'll feel for days."
]>>
<<= _lossText.random()>>
<br><br>
<span class="warning">You lost. Show money: $<<print _purse>>.</span>
<</if>>
<br><br>
<<link "Head back out." $return>><</link>><h2>At the Ropes</h2>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.min($energy + 1, $energyMax)>>
<div class="intro-image wide">
<img src="images/scenes/boxing/boxing_ringside1.jpeg" width="100%">
</div>
<br>
<<set _watchText = [
"You find a gap at the ropes and watch. Two men you half recognize from the heavy bags trade bare-fisted shots until one of them stops getting up. It's ugly and honest in a way the rest of your week isn't, and you understand, a little, why men keep coming back to the bottom of this room.",
"You stand in the crowd and let the night happen. A wiry kid with fast hands takes apart someone twice his size, and the money moves around you in folded handshakes. Nobody asks your name. For an hour you are nothing but another face at the ropes, and it is almost restful.",
"The card runs three bouts while you watch. One ends in seconds, one drags until both men can barely lift their arms, and the last is close enough that the room forgets to breathe. You leave before the cash is fully counted, the smell of it still on you."
]>>
<<= _watchText.random()>>
<br><br>
<<link "Head back out." $return>><</link>><h2><<print passage()>></h2>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _joggerImg = "images/characters/npc/jogger" + random(1, 5) + ".jpeg">>
<div class="char-scene">
<img @src="_joggerImg" class="char-img">
<div class="char-text">
<<set _lines = [
"A woman comes toward you on the path, moving at a good pace. She holds your eye for a beat longer than the narrow path requires, and neither of you slows.",
"You pass a jogger going the other way. She glances over as you draw level, and you catch yourself looking back over your shoulder once she's gone by.",
"A woman runs past close on the narrow stretch. For a second your eyes meet, and she's the one who doesn't look away first.",
"You nearly clip shoulders with a woman heading the other direction. She turns her head as you pass, and so do you, and the run feels different for the rest of it."
]>>
<<= _lines.random()>>
<span class="arousal">Arousal increased.</span>
</div>
</div>
<<link "Finish your run." $return>><</link>><h2><<print passage()>></h2>
The canal cuts through the back of the neighborhood, the path along it cracked asphalt patched in places with rougher gravel. On one side a row of warehouses, mostly converted, mostly to nothing useful. On the other, water dark with algae and the occasional shopping cart. In the distance, the Helion tower catches whatever light the day has left.
<<switch $time>>
<<case 0>>The path is empty in the early morning. Mist hangs over the water, and the only sound is your own breathing.
<<case 1>>Late morning brings a few cyclists and dog walkers, all moving with the unhurried purpose of people who don't have anywhere to be.
<<case 2>>Midday sun flattens the canal into a dull metallic shine. The benches are taken by men with cans they aren't trying to hide.
<<case 3>>Afternoon light slants across the water. A heron stands on the far bank, indifferent to everything.
<<case 4>>Late afternoon, and the path is starting to fill with people heading home, hands deep in pockets, eyes down.
<<case 5>>Early evening turns the water gold for a few minutes before letting it go again.
<<case 6>>Evening dims the canal, lamps coming on along the far bank in patchy intervals.
<<case 7>>Late evening, and the path is almost empty. The water is a black slick, the warehouses dark behind it.
<<case 8>>Night. The path is unlit in long stretches, and only a fool would jog it now.
<</switch>>
<br><br>
Not a bad place for getting some exercise.
<br>
<<if $time >= $timeMax>>
//It's too late for a run.//
<<elseif $arousal >= 8>>
//You can't focus on a run while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < 1>>
//You're too exhausted to train right now.//
<<else>>
<<link "Go for a run along the canal.">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $fitness += 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
/* Roll for the jogger encounter on this run */
<<if random(1, 100) <= 40>>
<<goto "Canal Jogger">>
<<else>>
<<goto $return>>
<</if>>
<</link>>
<</if>>
<br><br>
A converted warehouse sits back from the path, the faded sign of the Lower Hill Boxing Club above its door.
<br>
<<if $time <= 6>>
<<link [[🥊 Head into the boxing club.|Boxing Club]]>><</link>>
<<else>>
//The boxing club has its shutters down for the night.//
<</if>>
/* Evening: Lady of the night */
<<if $time >= 5 and $time < $timeMax>>
<br><br>
<div class="char-scene">
<img @src="either('images/characters/npc/sw1_1.jpeg', 'images/characters/npc/sw1_2.jpeg')" class="char-img">
<div class="char-text">
A blonde woman is waiting where the lamplight gives out, scanning the path. She catches your eye and holds it as you pass.
<br>
<<link '//"Looking for some company?"//' "Canal SW Approach">><</link>>
</div>
</div>
<<else>>
<br><br>
<</if>>
<<link [[🏠 Go home|Living Room]]>><</link>><h2>Lady of the Night</h2>
<div class="char-scene">
<img @src="either('images/characters/npc/sw1_1.jpeg', 'images/characters/npc/sw1_2.jpeg')" class="char-img">
<div class="char-text">
You slow, and she falls into step, steering the two of you into the dark stretch past the last working lamp. Up close she is older than the lamplight suggested, her smile worn smooth from use. She names her prices without much ceremony.
</div>
</div>
<br><br>
<<if $money >= 30>>
<<link "Pay for a handjob. ($30)" "Canal SW Physical">>
<<set $money -= 30>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<addSuspicion 1>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "hj">>
<</link>>
<<else>>
//A handjob ($30), but you're short.//
<</if>>
<br>
<<if $money >= 50>>
<<link "Pay for a blowjob. ($50)" "Canal SW Physical">>
<<set $money -= 50>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<addSuspicion 2>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "bj">>
<</link>>
<<else>>
//A blowjob ($50), but you're short.//
<</if>>
<br>
<<if $fitnessTier < 3 and $energy < 1>>
//Sex ($90), but you're too worn out to manage it tonight.//
<<elseif $money >= 90>>
<<link "Pay for sex. ($90)" "Canal SW Physical">>
<<set $money -= 90>>
<<set $arousal = Math.max($arousal - 10, 0)>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "sex">>
<<sexEnergy 1>>
<</link>>
<<else>>
//Sex ($90), but you're short.//
<</if>>
<br><br>
<<link "Think better of it and walk on." $return>><</link>><h2>Her Flat</h2>
<<set _gifs = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _gifs.push("sw1_mmf" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/sw/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"She doesn't even blink at the pair of you on her step, just adjusts the number and stands aside. The flat is the same lamplit, lived-in dim as before, only now there's $friend.name filling the doorway behind you, drunk, loud and with a big grin on face. A couple of minutes later she is sitting on the edge of the bed sucking you off in turns, and the inital awkwardness lifts. Before long, she bends over the bed. You step in behind her and push your cock into her pussy while she opens her mouth for $friend.name. He grips her hair and feeds his dick between her lips. You fuck her from behind in hard thrusts, hips slapping her ass, while she gags around his cock and takes both of you without pause, like the professional she is. She stays on her hands and knees as you switch positions, $friend.name moving behind her to pound her pussy while you fuck her mouth. Afterward $friend.name is already telling it back to you like a story, and you both laugh, because the alternative is thinking about it.",
"The cab ride is all $friend.name, narrating the night like it's already legendary. She meets you at the foot of the stair, counts the cash without a word, and takes the two of you up. Inside the warm, lamplit flat she drops to her knees on the rug and gets to work fast. She wraps her lips around your cock first, sucking hard and wet, tongue sliding under the head while her hand pumps the base. She alternates between you, jerking whichever cock isn’t in her throat, keeping both of you rock hard. As she lies down on the bed and spreads her legs, $friend.name quickly gets between them first and push into her wet pussy while she angles her head to the side and opens her mouth for you. $friend.name grabs her tit and fucks her in short, rough thrusts. Her tongue works your cock as your hips slowly drive in and out. You switch places. You ram into her pussy while $friend.name feed his cock down her throat. The room fills with wet sounds, skin on skin, her muffled moans, the slap of balls against her. $friend.name cums first, shooting thick ropes straight down her throat. You pull out and paint her stomach with heavy spurts. She wipes her mouth, cleans up with a towel, and pulls her clothes on. Outside you catch each other’s eyes and break into the same drunk, guilty laugh."
]>>
<<= _scene.random()>>
<br><br>
<<link "Head home." "Living Room">><</link>><h2>Her Flat</h2>
<<set $swEver = true>>
<<switch $swService>>
<<case "hj">>
<<set _gifs = ["sw1_hj1.gif", "sw1_hj2.gif"]>>
<<case "bj">>
<<set _gifs = ["sw1_bj1.gif", "sw1_bj2.gif"]>>
<<case "sex">>
<<set _gifs = ["sw1_h1.gif", "sw1_h2.gif"]>>
<</switch>>
<div class="intro-image">
<img @src="'images/h/sw/' + _gifs.random()" width="100%">
</div>
<br>
<<switch $swService>>
<<case "hj">>
She leads you up the narrow stair to the flat that reeks of someone else's stale smoke and sweat. Her grip is tight and slick from the lube she keeps by the bed, stroking your cock in fast, mechanical pumps while her eyes stay glued to the window like she's already thinking about the next client. Your cock throbs in her fist, balls tightening fast under the relentless tug, and you spill thick ropes of cum across her knuckles before you've even caught your breath. She wipes the mess off on the towel she keeps ready, then nods toward the door and tells you to mind the step on the way down.
<<case "bj">>
The flat is small and dim, lit only by a lamp draped in a scarf. She drops to her knees without a word, takes your cock into her mouth and works it with slow, practiced strokes. Her tongue slides along the shaft while her lips form a tight seal, sucking steadily until your balls tighten and you pump thick cum straight down her throat. She swallows without fuss, stands, and sees you to the door with the brisk, almost kind efficiency of a woman closing up a shop.
<<case "sex">>
Her flat is warmer than you expected, lived in, a kettle somewhere and a coat thrown over a chair. For a little while, in the lamplight, it is easy to mistake it for something it isn't, and she is good at letting you. She drops to her knees right there by the bed, pulls your cock out and sucks it down fast and wet, her mouth working in quick, practiced pulls until you're stiff and throbbing against her tongue. She lies down and spreads her legs for you. You get between them and grab her tit while pushing inside. She stays quiet while you fuck her in steady thrusts, then she shifts onto all fours. You follow, sliding back into her from behind, pounding harder now as her ass slaps against you. You don't last long. You fill the condom deep in her pussy while she stays on her hands and knees, breathing steady. She pulls off, ties the condom and tosses it, then starts pulling her clothes back on. You're still catching your breath in her sheets when she hands you your shoes.
<</switch>>
<br><br>
<<link "Head back out." $return>><</link>><h1>$name</h1>
''Physique''
<br>
Looking at your fitness and physique, you're
<<switch $fitnessTier>>
<<case 5>>
in peak condition, powerful and finely tuned. There's nothing soft left to find. Holding a body like this takes real discipline, but you've earned the right to it.
<<case 4>>
very athletic. You move with a strength and confidence you'd half forgotten was ever yours, and your reflection is something you don't mind catching anymore.
<<case 3>>
athletic, and clearly in good shape. Your body does what you ask of it without complaint. Sex, and the quieter moments you take to yourself, don't cost you anything now; you come away from them loose and easy rather than wrung out.
<<case 2>>
fit. The old softness has mostly burned off, and there's real stamina behind you; you reach the end of a day with something still in reserve. This is about as far as raw energy alone will carry you, though. From here, staying in shape starts to pay off in other ways.
<<case 1>>
getting in shape. The changes are just starting to show, and there's a little more in the tank than there used to be. A day doesn't empty you out quite as fast.
<<default>>
out of shape. Thirty pounds you didn't used to carry, and you feel every one of them on the stairs and in the mirror. Even a little training would start to give some of it back.
<</switch>>
<br>
<<if $fitnessTier >= 5>>
<<meter 1 1 "Peak condition" "#FF9F40">>
<<else>>
<<set _prev = [0, 10, 15, 20, 30][$fitnessTier]>>
<<set _next = [10, 15, 20, 30, 45][$fitnessTier]>>
<<set _progress = $fitness - _prev>>
<<set _target = _next - _prev>>
<<meter _progress _target "Next level" "#FF9F40">>
<</if>>
<br><br>
''Home''
<br>
Home is a cramped two-bedroom flat off the bypass, the radiators loud and half the boxes still in the hall. It's a roof, and not much more than that. <strong>Rent runs $<<print $rent>> a week</strong>, due every Sunday.
<<if $money >= $rent>>
You've got enough on hand to cover the next one.
<<else>>
As things stand, you're short of the next one.
<</if>>
<br><br>
''Work''
<br>
You work at <strong>Helion Dynamics</strong> as a <strong>$job.title</strong>, earning $<<print $job.wage>> per day.
<br><br>
<<if $job.level >= 5>>
You've reached the top of the ladder here. There's nowhere left to climb.
<<else>>
<<set _prev = [0, 0, 10, 25, 45][$job.level]>>
<<set _next = [0, 10, 25, 45, 60][$job.level]>>
<<set _progress = $job.performance - _prev>>
<<set _target = _next - _prev>>
<<meter _progress _target "Next promotion" "#3D73FC">>
<<if $job.promotionPending>>
<span class="good">Word is you're due a promotion. You'll hear about it next time you're in the office.</span>
<</if>>
<</if>>
<br><br>
<<link 'Return' $return>>
<</link>>/* Trigger: Project choice pending */
<<if $project.pendingChoice === "genre">><<goto "Project Choice Genre">>
<<elseif $project.pendingChoice === "protagonist">><<goto "Project Choice Protagonist">>
<<elseif $project.pendingChoice === "feature">><<goto "Project Choice Feature">>
<</if>>
<h2>Computer</h2>
<<if $pcMsg !== "">>
<span class="good"><<= $pcMsg>></span>
<br><br>
<<set $pcMsg = "">>
<</if>>
You sit down at the desk and wake the screen.
<br><br>
''Your side project''
<br>
<<if $project.started>>
Your game sits at version <<print $project.version>>.0, with <<print $project.supporters>> supporters putting $<<print $project.weeklyIncome>> a week your way.
<<else>>
A blank project folder waits. You've thought for years about building your own game, the kind you can't find in stores. Maybe it's time you actually did.
<</if>>
<br>
<<if $energy < 1>>
//You're too drained to write a line of anything.//
<<elseif $time >= $timeMax>>
//It's too late to focus on it tonight.//
<<else>>
<<link "Work on your game." "Computer">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $project.started = true>>
<<set $project.dev += 1>>
<<if $project.dev >= $project.devNeeded>>
<<set $project.dev = 0>>
<<set $project.version += 1>>
/* Base gain, then genre modifier. Broad = wider reach,
niche = smaller but higher-paying crowd (mult set at choice). */
<<set _gain = random(3, 6) + ($project.version * 2)>>
<<if $project.choices.genre === "broad">>
<<set _gain += 2>>
<<elseif $project.choices.genre === "niche">>
<<set _gain = Math.max(_gain - 1, 1)>>
<</if>>
<<set $project.supporters += _gain>>
<<set $project.devNeeded = Math.min($project.devNeeded + 1, 8)>>
<<set $project.weeklyIncome = $project.supporters * $project.supMult>>
/* Milestone choices fire on reaching v1, v2, v3.
pendingChoice routes the next Computer visit to the fork. */
<<if $project.version === 1>>
<<set $project.pendingChoice = "genre">>
<<elseif $project.version === 2>>
<<set $project.pendingChoice = "protagonist">>
<<elseif $project.version === 3>>
<<set $project.pendingChoice = "feature">>
<</if>>
<<set $pcMsg = "You ship version " + $project.version + ".0. Word gets around, and " + _gain + " new supporters pledge. Your page now brings in $" + $project.weeklyIncome + " a week.">>
<<else>>
<<set $pcMsg = "You sink an hour into the project. It's coming along.">>
<</if>>
<</link>>
<</if>>
<<if $project.started>>
<br>
<<link "Check your supporter page." "Project Page">><</link>>
<</if>>
<br><br>
''Helion work''
<br>
<<if $job.wfhToday>>
//You've already put in extra hours from home today.//
<<elseif $arousal >= 8>>
//You can't focus on work while this wound up.//
<<elseif $energy < 2>>
//You're too drained for more of Helion's work tonight.//
<<elseif $time >= $timeMax>>
//It's too late to get any real work done.//
<<else>>
You could put in some extra hours, get ahead of the backlog, make yourself harder to overlook.
<br>
<<link "Work from home for Helion." "Computer">>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $job.performance += 0.5>>
<<set $job.wfhToday = true>>
<<promotionCheck>>
<<if $job.promotionPending>>
<<set $pcMsg = "You grind through a few extra tickets. Your standing's high enough now that a promotion feels close.">>
<<else>>
<<set $pcMsg = "You grind through a few extra tickets. It won't go unnoticed.">>
<</if>>
<</link>>
<</if>>
<br><br>
/* FUTURE: once $job.level reaches Lead+, the clock-in expectation in workCheck
could ease, with most work handled here and office visits optional. That arc
belongs with the assistant character and her romance, not here yet. */
<<link "Step away from the desk." $return>><</link>><h1><<print passage()>></h1>
''Time''
<br>
Time ($time):
<<link '+' 'Control Panel'>>
<<set $time += 1>>
<<if $time > $timeMax>><<set $time = $timeMax>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $time -= 1>>
<<if $time < 0>><<set $time = 0>><</if>>
<</link>>
<br>
Day ($gameDay):
<<link 'Next Day' 'Control Panel'>>
<<dayshift>>
<</link>>
/
<<link 'Previous Day' 'Control Panel'>>
<<set $gameDay -= 1>>
<<if $gameDay < 1>><<set $gameDay = 1>><</if>>
<<set $weekday -= 1>>
<<if $weekday < 1>><<set $weekday = 7>><</if>>
<</link>>
<br><br>
''Stats''
<br>
Energy ($energy):
<<link '+' 'Control Panel'>>
<<set $energy += 1>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $energy -= 1>>
<</link>>
<br>
Max Energy ($energyMax):
<<link '+' 'Control Panel'>>
<<set $energyMax += 1>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $energyMax -= 1>>
<</link>>
<br>
Fitness ($fitness):
<<link '+' 'Control Panel'>>
<<set $fitness += 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<<fitnesscheck>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $fitness -= 1>>
<<fitnesscheck>>
<</link>>
<br>
Arousal ($arousal):
<<link '+' 'Control Panel'>>
<<set $arousal += 1>>
<<if $arousal > $arousalMax>><<set $arousal = $arousalMax>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $arousal -= 1>>
<<if $arousal < 0>><<set $arousal = 0>><</if>>
<</link>>
<br><br>
''Relations''
<br>
$wife.name Relationship ($wife.relationship):
<<link '+5' 'Control Panel'>>
<<set $wife.relationship += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.relationship += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.relationship -= 1>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.relationship -= 5>>
<</link>>
<br>
$wife.name Mood ($wife.mood):
<<link '+' 'Control Panel'>>
<<set $wife.mood += 1>>
<<if $wife.mood > 3>><<set $wife.mood = 3>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $wife.mood -= 1>>
<<if $wife.mood < -3>><<set $wife.mood = -3>><</if>>
<</link>>
<br>
$wife.name Suspicion ($wife.suspicion):
<<link '+5' 'Control Panel'>>
<<set $wife.suspicion += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.suspicion += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.suspicion -= 1>>
<<if $wife.suspicion < 0>><<set $wife.suspicion = 0>><</if>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.suspicion -= 5>>
<<if $wife.suspicion < 0>><<set $wife.suspicion = 0>><</if>>
<</link>>
<br>
Suspicion Locked ($wife.suspicionLocked):
<<link 'Toggle' 'Control Panel'>>
<<set $wife.suspicionLocked = not $wife.suspicionLocked>>
<</link>>
<br>
<<link 'Preview discovery scene (non-destructive)' 'Wife Discovery'>>
<<set $wife.discoveryResult = 15>>
<</link>>
<br>
$wife.name Worry ($wife.worry):
<<link '+5' 'Control Panel'>>
<<set $wife.worry += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.worry += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.worry -= 1>>
<<if $wife.worry < 0>><<set $wife.worry = 0>><</if>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.worry -= 5>>
<<if $wife.worry < 0>><<set $wife.worry = 0>><</if>>
<</link>>
<br>
<<link 'Preview worry scold (non-destructive)' 'Wife Worry'>>
<<set $wife.worryResult = 4>>
<</link>>
<br><br>
''Work (debug)''
<br>
Performance ($job.performance):
<<link '+5' 'Control Panel'>>
<<set $job.performance += 5>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $job.performance -= 5>>
<</link>>
<br>
Level ($job.level): $job.title
<br>
<<link 'Level up (debug)' 'Control Panel'>>
<<if $job.level < 5>>
<<applyPromotion>>
<</if>>
<</link>>
<br>
<<link "Force promotion (debug)" $return>>
<<set $job.promotionPending = true>>
<</link>>
<br><br>
''Assistant / Nadia (debug)''
<br>
State: met=$assistant.met / unlocked=$assistant.unlocked / seed=$assistant.seedStage / flirt=$assistant.flirtStage / infl=$assistant.influence / tier=$assistant.tier
<br>
Trip: affair=$assistant.affair / taken=$assistant.tripTaken / pending=$assistant.tripPending / lastOffer=$assistant.lastTripOfferDay
<br>
Hookup: count=$assistant.hookupCount / heat=$assistant.heat / today=$assistant.hookupToday / lastLoc="$assistant.lastHookupLoc" / lastAct="$assistant.lastHookupAct" / lastDay=$assistant.lastHookupDay
<br>
Cool-off: pending=$assistant.coolOffPending / until=$assistant.coolOffUntil / <<if $gameDay < $assistant.coolOffUntil>><<= $assistant.coolOffUntil - $gameDay>> day(s) left<<else>>not locked<</if>>
<br>
Deferred morning: "$deferredMorning"
<br>
Influence ($assistant.influence):
<<link '+10' 'Control Panel'>>
<<set $assistant.influence += 10>>
<<assistantCheck>>
<</link>>
/
<<link '+2' 'Control Panel'>>
<<set $assistant.influence += 2>>
<<assistantCheck>>
<</link>>
/
<<link '-2' 'Control Panel'>>
<<set $assistant.influence = Math.max($assistant.influence - 2, 0)>>
<<assistantCheck>>
<</link>>
/
<<link '-10' 'Control Panel'>>
<<set $assistant.influence = Math.max($assistant.influence - 10, 0)>>
<<assistantCheck>>
<</link>>
<br>
Heat ($assistant.heat):
<<link '+3' 'Control Panel'>>
<<set $assistant.heat = Math.min($assistant.heat + 3, 10)>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $assistant.heat = Math.min($assistant.heat + 1, 10)>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $assistant.heat = Math.max($assistant.heat - 1, 0)>>
<</link>>
/
<<link '-3' 'Control Panel'>>
<<set $assistant.heat = Math.max($assistant.heat - 3, 0)>>
<</link>>
<br>
<<link 'Clear the hookup one-shot (go again today)' 'Control Panel'>>
<<set $assistant.hookupToday = false>>
<</link>>
<br>
<<link 'Clear the lockout (reopen the loop now)' 'Control Panel'>>
<<set $assistant.coolOffUntil = 0>>
<<set $assistant.coolOffPending = 0>>
<</link>>
<br>
/* Arms the cool-off without needing a discovery to land at home. The scene
fires on the next visit to Helion Dynamics between time 1 and 5. Requires
$assistant.affair to already be true. */
<<link 'Arm cool-off: discovery (5 days)' 'Control Panel'>>
<<set $assistant.coolOffPending = 5>>
<</link>>
/
<<link 'Arm cool-off: ultimatum (7 days)' 'Control Panel'>>
<<set $assistant.coolOffPending = 7>>
<</link>>
<br>
<<link 'Clear daily one-shots (probe/talk again today)' 'Control Panel'>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastAction = "">>
<</link>>
<br>
<<link 'Clear deferred morning' 'Control Panel'>>
<<set $deferredMorning = "">>
<</link>>
<br><br>
<<link 'Set up L4 start (full arc from the grad cohort)' 'Control Panel'>>
/* Force the level DOWN as well as up, so this works from a finished save */
<<set $job.level = 4>>
<<set $job.title = "Lead Engineer">>
<<set $job.wage = 325>>
<<set $job.performance = 45>>
<<set $job.promotionPending = false>>
/* Full wipe: every assistant field, including the ones added in 0.2.0 */
<<set $assistant.met = false>>
<<set $assistant.unlocked = false>>
<<set $assistant.seedStage = 0>>
<<set $assistant.lastSeedDay = 0>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.tierUp = false>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastProbe = "">>
<<set $assistant.lastAction = "">>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<<assistantCheck>>
<</link>>
<br>
<<link 'Jump to L5: Nadia unlocked (hub-ready)' 'Helion Dynamics'>>
/* Job -> Engineering Manager, performance kept in sync with the level */
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 60>><<set $job.performance = 60>><</if>>
<<set $job.promotionPending = false>>
/* Nadia -> past the seeds and the reunion, romance live at tier 0 */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $assistant.unlocked = true>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastProbe = "">>
<<set $assistant.lastAction = "">>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<<assistantCheck>>
/* Land in the office inside the hub's daytime window so her desk link shows */
<<if $time < 1 or $time > 5>><<set $time = 1>><</if>>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Jump to L5: play the Reunion scene' 'Assistant, Reunion'>>
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 70>><<set $job.performance = 70>><</if>>
<<set $job.promotionPending = false>>
/* Prereqs so the scene is legit; the Reunion passage itself flips unlocked */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $assistant.unlocked = false>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<<assistantCheck>>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Jump to the trip gate (offer fires next clock-in)' 'Control Panel'>>
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 60>><<set $job.performance = 60>><</if>>
<<set $job.promotionPending = false>>
/* Everything the Workday trip branch tests for */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $assistant.unlocked = true>>
<<set $assistant.flirtStage = 3>>
<<set $assistant.lastFlirtDay = $gameDay - 3>>
<<set $assistant.influence = 30>>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<<assistantCheck>>
/* Put him on an unworked weekday morning so he can clock in */
<<if $weekday > 5>><<set $weekday = 1>><</if>>
<<set $time = 1>>
<<set $job.attendedToday = false>>
<<set $job.missedToday = false>>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Jump to the office loop (affair live, in the window)' 'Helion Dynamics'>>
<<set $job.level = 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<<if $job.performance < 60>><<set $job.performance = 60>><</if>>
<<set $job.promotionPending = false>>
/* Past the trip, affair live, influence floored the way Trip Return leaves it */
<<set $assistant.met = true>>
<<set $assistant.seedStage = 4>>
<<set $assistant.unlocked = true>>
<<set $assistant.flirtStage = 3>>
<<set $assistant.affair = true>>
<<set $assistant.tripTaken = true>>
<<set $assistant.tripPending = false>>
<<if $assistant.influence < 40>><<set $assistant.influence = 40>><</if>>
<<clearHookupState>>
<<assistantCheck>>
/* Everything the gate tests for, minus the affair clauses above */
<<if $weekday > 5>><<set $weekday = 1>><</if>>
<<set $job.attendedToday = true>>
<<set $job.missedToday = false>>
<<set $time = 4>>
<<if $energy < 2>><<set $energy = 2>><</if>>
<<set $deferredMorning = "">>
<<set $return = "Helion Dynamics">>
<</link>>
<br>
<<link 'Force trip offer to re-fire (after a decline)' 'Control Panel'>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $assistant.lastFlirtDay = $gameDay - 3>>
<<set $assistant.tripPending = false>>
<<set $job.attendedToday = false>>
<<set $job.missedToday = false>>
<<if $time > 1>><<set $time = 1>><</if>>
<</link>>
<br>
<<link 'Reset Nadia to untouched (keep job level)' 'Control Panel'>>
<<set $assistant.met = false>>
<<set $assistant.unlocked = false>>
<<set $assistant.seedStage = 0>>
<<set $assistant.lastSeedDay = 0>>
<<set $assistant.flirtStage = 0>>
<<set $assistant.lastFlirtDay = 0>>
<<set $assistant.influence = 0>>
<<set $assistant.tier = 0>>
<<set $assistant.tierUp = false>>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<<set $assistant.lastProbe = "">>
<<set $assistant.lastAction = "">>
<<set $assistant.affair = false>>
<<set $assistant.tripTaken = false>>
<<set $assistant.tripPending = false>>
<<set $assistant.lastTripOfferDay = -99>>
<<set $deferredMorning = "">>
<<clearHookupState>>
<</link>>
<br><br>
''Phone (debug)''
<br>
Nude ask today ($phone.nudeAskedToday) / Last nude day ($phone.lastNudeDay) / Cooldown ends day <<= $phone.lastNudeDay + $phone.nudeCooldown>>
<br>
<<link 'Unlock nude ask now' 'Control Panel'>>
<<set $phone.nudeAskedToday = false>>
<<set $phone.lastNudeDay = $gameDay - $phone.nudeCooldown>>
<</link>>
<br>
<<link 'Clear "asked today" flag' 'Control Panel'>>
<<set $phone.nudeAskedToday = false>>
<</link>>
<br>
<<link 'Reset nude cooldown' 'Control Panel'>>
<<set $phone.lastNudeDay = $gameDay - $phone.nudeCooldown>>
<</link>>
<br>
<<link 'Queue wife nude (unread)' 'Control Panel'>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _nudes.random()>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifeMsgType = "nude">>
<<set $phone.wifeMsgText = [
"thinking about you. no reason. carry on 🙈",
"house is empty and I'm bored. somehow this is your fault 😏",
"don't open this at work. actually, do. I don't care 😈",
"just out of the shower and you crossed my mind 💋",
"no occasion. just wanted you to know what's waiting at home 🔥",
"I miss you. that's the polite version 😘",
"you've been good lately. consider this the review 😌"
].random()>>
<</link>>
<br>
<<link 'Queue lingerie selfie (unread)' 'Control Panel'>>
<<set _ling = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _ling.push("w_phone_ling" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _ling.random()>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifeMsgType = "lingerie">>
<<set $phone.wifeMsgText = [
"couldn't resist trying it on again 😘 thank you for this, you've got better taste than you let on 💕",
"feeling dangerously good in what you picked out for me 🔥 thought you should see what's waiting at home...",
"thanks for the shopping spree, you officially have an eye for this 😏 here's a little preview, don't get distracted 💋",
"so. worth. it. 😍 just gonna leave this right here and let you think about it all day 😈"
].random()>>
<</link>>
<br><br>
''Inventory''
<br>
Money ($money):
<<link '+1000' 'Control Panel'>>
<<set $money += 1000>>
<</link>>
/
<<link '+100' 'Control Panel'>>
<<set $money += 100>>
<</link>>
/
<<link '-100' 'Control Panel'>>
<<set $money -= 100>>
<</link>>
<br><br>
<<link "Get PC" $return>>
<<set $items.pc = true>>
<</link>><br>
<<link "Get Yoga Mat" $return>>
<<set $items.yogaMats = true>>
<</link>><br>
<<if not $items.goodBed>>
<<link "Get Bed" "Control Panel">>
<<set $items.goodBed = true>>
<</link>><br>
<<else>>
Bed owned.<br>
<</if>>
<br>
<br>
<<link 'Return' $return>>
<</link>><h2>Sal's Pawn & Loan</h2>
A narrow shopfront wedged between the dead bakery and the Anchor. The window is a jumbled altar to other people's bad weeks: a saxophone, three wedding rings pinned to a velvet card, a drone still in its box, a stuffed marlin nobody came back for. Behind the counter sits Sal, a broad man in a cardigan who gives the impression of having been here longer than the building itself. Whatever you're after, his face suggests he's probably got it out the back.
<<set _greet = [
'Sal looks up from a watch he\'s prying open. //"Browsing, or buying? It\'s all the same in here."//',
'Sal doesn\'t look up. //"Take your time. Everything in here already waited longer than you will."//',
'Sal tips his head at the shelves. //"All sorts today. People had a rough month."//'
]>>
<<= _greet.random()>>
<br><br>
''On the shelves''
<br>
/* STOCK. Append an entry to add an item. Each needs:
flag - the $items key it sets to true on purchase
label - link text
price - cost in dollars
desc - what the player sees
patter - Sal's line about it
Items the player already owns drop out of the list automatically. */
<<set _stock = [
{
flag: "pc",
label: "Desktop computer",
price: 250,
desc: "A desktop tower with a flat monitor, a few years old but wiped clean and humming quietly at the end of the counter.",
patter: "Belonged to a kid who was going to be a streamer. They're all going to be a streamer. Runs fine, I checked it myself."
},
{
flag: "yogaMats",
label: "Set of yoga mats",
price: 60,
desc: "A pair of foam yoga mats, rolled up and barely scuffed.",
patter: "A lady buys these off me every January and sells them back every February. This year she didn't even make it to February."
},
{
flag: "goodBed",
label: "Solid oak bed frame and mattress",
price: 200,
desc: "A heavy oak frame and a barely-used mattress still in its wrapping, far better than the sagging thing you sleep on now. You'd sleep through the night more often on this.",
patter: "Memory foam, top of the line. Remembers your back so you don't have to. Only thing it can't remember is why the guy who owned it never came back for it."
}
]>>
<<set _anyStock = false>>
<<for _i = 0; _i < _stock.length; _i++>>
<<if not $items[_stock[_i].flag]>>
<<set _anyStock = true>>
<<capture _i>>
<<= _stock[_i].desc>>
<br>
//"<<= _stock[_i].patter>>"//
<br>
<<if $money >= _stock[_i].price>>
<<link `_stock[_i].label + " ($" + _stock[_i].price + ")"` "Eastgate Pawnbroker">>
<<set $items[_stock[_i].flag] = true>>
<<set $money -= _stock[_i].price>>
<</link>>
<<else>>
//<<= _stock[_i].label>> ($<<= _stock[_i].price>>), but you're short.//
<</if>>
<br><br>
<</capture>>
<</if>>
<</for>>
<<if not _anyStock>>
Sal spreads his hands. //"Nothing else here you need right now. Come back when you've worn something out."//
<br><br>
<</if>>
/* SELLING (future): a second loop here over a sellable-inventory list,
paying out a fraction of value and clearing the $items flag, would slot
in cleanly. Sal already buys as well as sells in the fiction. */
<<link [[Back out to the plaza.|Eastgate Plaza]]>><</link>><h2><<print passage()>></h2>
A strip mall off the access road, the kind of place that was somebody's idea of progress back when the highway was new and has been managing decline ever since. A shuttered bakery, a barber that's only ever open when you don't need one, a laundromat with a hand-taped sign about the machines. At the end, lit a little too brightly, sits Karim's Liquor. Past it, a windowless bar called the Anchor with the blinds always down.
<<switch $time>>
<<case 0>>Early morning. The gates are mostly down. A man hoses the sidewalk outside the laundromat, more out of ritual than effect.
<<case 1>>Late morning. The liquor store is open, a delivery half-unloaded across its doorway. Two retirees share a bench and a thermos.
<<case 2>>Midday. The lot is as busy as it gets, which isn't very. Someone's stroller is parked outside the bakery that isn't a bakery anymore.
<<case 3>>Early afternoon. The light's flat and the stores are quiet. The barber's chair sits empty behind the glass.
<<case 4>>Late afternoon. School's out somewhere nearby; kids drift across the lot in twos and threes, eyeing the liquor store they can't get served in.
<<case 5>>Early evening. The gates are coming down one by one. Karim's is still lit, the last of the trade trickling in.
<<case 6>>Evening. Most of the plaza has pulled its gates down, but Karim's stays lit at the end of the row, the Anchor's blinds glowing past it.
<<case 7>>Late evening. The storefronts are dark. The Anchor's the only thing still open, and it isn't asking to be looked at.
<<case 8>>Night. The lot is empty and half-lit, the kind of place you cross quickly or not at all.
<</switch>>
<br><br>
/* Liquor store: wine for the evening */
<<if $time <= 6>>
Karim's is open. A decent bottle of wine runs $20.
<br>
<<if $money >= 20>>
<<link "Buy a bottle of wine. ($20)" $return>>
<<set $money -= 20>>
<<set $items.wine += 1>>
<</link>>
<<else>>
//A bottle's $20, but you're short.//
<</if>>
<<else>>
//Karim's has pulled the gate down for the night.//
<</if>>
<br><br>
Sal's Pawn & Loan sits at the end of the row, its window crammed with other people's misfortune.
<br>
<<if $time <= 6>>
<<link [[Step into Sal's.|Eastgate Pawnbroker]]>><</link>>
<<else>>
//Sal's has the shutters down for the night.//
<</if>>
<br><br>
The Anchor sits at the dark end of the row, blinds down, a muffled thump of jukebox bass leaking out under the door.
<br>
<<if $time >= ($weekday >= 6 ? 2 : 4)>>
<<link [[Push into the Anchor.|The Anchor]]>><</link>>
<<elseif $weekday >= 6>>
//The Anchor opens by noon on weekends, but it's too early yet.//
<<else>>
//On a weekday the Anchor doesn't open its doors until the afternoon.//
<</if>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><h1>Game Over</h1>
<<switch $gameOverCause>>
<<case "divorce">>
You wake to the flat already changed. The hall is clearer than it has been in months, the boxes that never got unpacked packed again, by the door this time instead of against the wall.
<br><br>
$wife.name is dressed. Your son is dressed. There's a suitcase, and a smaller bag for him, the one with the cartoon zip he picked out himself.
<br><br>
She doesn't shout. That's the part that tells you it's real. The shouting was when there was still something to fight for.
<br><br>
<<speech "Wife" $wife.name>>
I gave it everything I had, longer than I should have. I kept waiting for the man I married to walk back through that door, and he didn't, and I can't keep teaching our son that this is what a marriage looks like.
<</speech>>
<br><br>
She tells you where she'll be. She tells you you'll still see him, that she would never take that from either of you. She is kind about it, in the careful way of someone who decided a long time ago and has run out of anger to spend.
<br><br>
Then she lifts the boy onto her hip, and he waves at you over her shoulder, not understanding, and the door closes, and the flat is very quiet.
<br><br>
You didn't earn it back. You ran out of time to try.
<<case "rent">>
The eviction notice arrived this morning. $wife.name didn't say much. You suspect she's been packing for days.
<br><br>
You stand in the entryway with a duffel bag at your feet, the home behind you already half-empty. The street outside is bright and indifferent.
<br><br>
You failed.
<<default>>
Whatever you were trying to rebuild has come apart in your hands. You didn't get there in time.
<</switch>>
<br><br>
<<link "Start over">>
<<script>>Engine.restart()<</script>>
<</link>><h2>Helion Dynamics</h2>
You leave with $wife.name's disappointment still hanging in the air behind you. She didn't argue. She just went back to getting the boy ready, her voice softening for him the way it wouldn't for you, and the door clicked shut on a Saturday that was supposed to be the three of you.
<br><br>
<<set $job.performance += 2>>
<<set _bonus = 80 + ($job.level * 40)>>
<<set $money += _bonus>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $time = Math.min($time + 3, $timeMax)>>
<<addWorry 1>>
<<switch $job.level>>
<<case 1>>
The floor is dead, half the lights off, and the crisis turns out to be exactly the kind of unglamorous mess that rolls downhill to whoever answers the phone. You spend hours babysitting a rollback for a client whose name you're still not allowed to know, running the same checks over and over while a senior on a call somewhere takes the credit for the fix. It's dull, and it's your Saturday, and you'd rather be pushing a swing. But the overtime is real money, and when you finally clock out a manager you barely recognize claps you on the shoulder and says he'll remember you came in. Maybe he will.
<<case 2>>
You're one of three who got the call, and the other two are visibly furious about it, which somehow makes it easier to be the one who stays calm. The fix isn't complicated once you find it, buried in someone else's undocumented shortcut, but finding it eats the whole afternoon. Nobody thanks you in a way that means anything. Still, the extra pay lands in your account before you've left the building, and you catch your name in a thread going up to people you've never met. That's worth something on a ladder like this one.
<<case 3>>
They call you because the quieter work broke, and the quieter work isn't the kind you can hand to just anyone. You spend the day up on the floor your card now reaches, undoing a problem for a client with a name you wish you didn't know, and the whole time a small clear voice reminds you it's Saturday and your son is at a park without you. You fix it. You're good at it. The money is better than good, and the right people see that you were the one who came in. You tell yourself that's why you did it, on the drive home, and almost believe it.
<<case 4>>
A crisis at this level means the client is important enough that someone senior has to be seen putting out the fire, and today that someone is you. You don't touch much code. You steer, you reassure, you make the calls that let the people below you do the actual work, and by evening it's contained and billable and yours. The bonus is the kind that used to feel like a lot of money, back before it stopped meaning anything. On the way out you think about the park you didn't go to, and how easily you talked yourself out of it, and how that's starting to be the easy part.
<<default>>
The building expects you when it matters, and today it mattered. You handle it the way you handle everything up here now, at a remove, through other people, and it's done by evening and the number attached to it is large. Somewhere across town the afternoon happened without you. You made good money. The people who decide these things noticed. You keep telling yourself that's the trade, and mostly you don't examine it too closely.
<</switch>>
<br><br>
<span class="good">Overtime: $<<print _bonus>>. Work performance improved.</span>
<br>
<span class="warning">$wife.name spent the day out with your son. Without you.</span>
<br><br>
<<link "Head home." "Living Room">><</link>><h2><<print passage()>></h2>
<<hookupGate>>
<<include 'Helion Dynamics, Description'>>
<<include 'Helion Dynamics, Triggers'>>
<<include 'Helion Dynamics, Basics'>>
<<if $assistant.unlocked and $time >= 1 and $time <= 5>>
<br><br>
<<if _hookupOffer>>
$assistant.name is at her desk two rows down, looking up over her screen and catching your glance.
<<else>>
$assistant.name is at her desk two rows down, working through something on her screen.
<</if>>
<br>
<<link [[Go over to her.|Assistant Interact]]>><</link>>
<</if>>
<<if $job.level >= 3 and $time <= 6>>
<br><br>
Your card opens the gym now, and it's free to staff.
<br>
<<link [[🏋 Head to the gym.|Helion Gym]]>><</link>>
<</if>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>>/* Desk */
<<if !$job.attendedToday>>
Your desk waits in the third row from the window, monitor dark, keyboard slightly crooked from the cleaner.
<<else>>
Your desk sits as you left it after clocking in, monitor dimmed, chair shoved back at an angle, the day's work already behind you.
<</if>>
<br>
/* Clock in */
<<if !$job.attendedToday>>
<<if $time < 2>>
<<if $arousal >= 8 and not $job.promotionPending>>
<span class="warning">You're wound too tight to concentrate on anything today. Sit down like this and the day won't count toward a promotion.</span>
<br>
<</if>>
<<if $job.promotionPending>>
<<link [[Sit down and start the day.|Helion Dynamics, Promotion]]>><</link>>
<<else>>
<<link [[Sit down and start the day.|Helion Dynamics, Workday]]>><</link>>
<</if>>
<<else>>
//You're too late. The workday has already moved on without you.//
<</if>>
<<else>>
//You've already put in your hours today.//
<</if>>/* Base description */
The Helion Dynamics office occupies a single floor of a glass-and-steel tower off the bypass. Open-plan rows of desks stretch toward the windows, broken up by glass-walled meeting rooms and a bank of vending machines. The carpet is the color of cold coffee, and the air has the still, recycled quality of a building whose windows haven't opened in years.
/* Time */
<<switch $time>>
<<case 0>>Early morning. The floor is empty, the cleaners long gone and the first arrivals not yet through the door.
<<case 1>>Late morning hum of keyboards, low voices, the occasional cough. Most desks are filled, screens deep in spreadsheets and Slack threads.
<<case 2>>Midday slump. Half the floor is at lunch; the other half is pretending to work while they wait their turn.
<<case 3>>The early afternoon drags, the post-lunch lull settling thick over the rows of desks.
<<case 4>>Late afternoon, and the floor is thinning out. Coats come off the backs of chairs, monitors blink to lock screens.
<<case 5>>Early evening. The windows turn orange. A few desks are still occupied by the keen, the desperate, and people avoiding home.
<<case 6>>The office is mostly dark. Cleaning staff move between empty desks; a monitor or two still glows.
<<case 7>>Late evening. The floor is silent, the cleaners gone, only a security light or two marking the long rows of desks.
<<case 8>>The office is closed for the night, locked behind keycard doors.
<</switch>>
/* Office heat state. Mirrors the chore-state line in the home rooms:
standing state, shown every visit, no daily gate. Nothing below 3. */
<<if $assistant.affair and $assistant.heat >= 3 and $time >= 1 and $time <= 5>>
<<if $assistant.heat >= 9>>
<span class="warning">Upper management has noticed what is going on between you and $assistant.name.</span>
<<elseif $assistant.heat >= 6>>
<span class="warning">You get the feeling that people are gossiping about you and $assistant.name.</span>
<<else>>
<span class="warning">Some people have started paying attention to you and $assistant.name.</span>
<</if>>
<</if>>
<br><br><h2>Helion Dynamics</h2>
<<if $job.eventOutcome !== "">>
<div class="char-scene">
<img @src="$job.sceneGif" class="char-img">
<div class="char-text">
<<= $job.sceneText>>
</div>
</div>
<</if>>
<<if $job.drainType == "late" and not $job.stayedLate>>
<<link "Head back to your desk." "Helion Dynamics, Workday">>
<<set $job.eventOutcome = "">>
<</link>>
<<else>>
<<link "Head out." $return>>
<<set $job.eventOutcome = "">>
<</link>>
<</if>><<clockIn>>
<<set _oldTitle = $job.title>>
<<applyPromotion>>
<h2>Helion Dynamics</h2>
<<switch $job.level>>
<<case 2>>
A few minutes after you sit down, your manager leans over the partition and asks if you've got a second. In the break room he tells you the payment-flow fix from a few weeks back traveled further up than you'd realized, and that someone finally noticed whose name was on the original commit. It isn't a speech. It's a sentence and a handshake. But by the time you're back at your desk, your title in the directory has changed, and so has the number on your payslip.
<<case 3>>
You're called into one of the glass rooms before you've even opened your laptop. A director you've spoken to maybe twice slides a revised contract across the table and tells you the team needs someone senior who can be trusted with "the quieter work." You don't ask what that means. You sign where she points. On the way out she mentions, lightly, that your keycard will get you a little further into the building now.
<<case 4>>
They take you up a floor this time. The lift won't even stop there without your new card. The desks are quieter, the screens angled away from the door, and nobody introduces themselves. Your new manager walks you past a row of offices and into one with your name already on a label by the door. He calls you Lead, shakes your hand, and tells you the clients up here pay better because they ask for more. You spend the rest of the day learning what "more" looks like, and trying not to think too hard about it.
<<case 5>>
There's no meeting room this time, just a corner office and a man you've only ever seen in all-hands recordings. He pours you a drink you don't want and tells you you've earned a seat at the table. Then he tells you what the table actually does. The unnamed clients have names now. Project Kestrel has a purpose. You understand, finally, why the floor below isn't allowed up here. You take the title. You take the money. You tell yourself you'll work out the rest later.
<</switch>>
<br><br>
<span class="good">Promoted: $job.title. New pay: $<<print $job.wage>> per day.</span>
<<if $job.level == 3>>
<br>
<span class="good">Your keycard now opens the company gym. Free to staff.</span>
<</if>>
<br><br>
<<link 'Clock out for the day.' $return>><</link>>/* Cool-off. Fires once on the first office visit after a discovery or an
ultimatum armed it in Dayshift. Sits above the break-room roll and takes
the whole passage into its else branch, so a firing visit does not
consume that day's sighting. goto does not halt the include. */
<<if $assistant.affair and $assistant.coolOffPending > 0 and $time >= 1 and $time <= 5>>
<<goto "Assistant, Cool Off">>
<<else>>
/* Break room sighting: rolled once per game day, consumed on view. */
<<if $job.breakRoomRollDay !== $gameDay>>
<<set $job.breakRoomRollDay = $gameDay>>
<<set $job.breakRoomToday = (random(1, 100) <= 35)>>
<</if>>
/* Break room ambient sighting: shows once, consumes the day's roll, +1 arousal */
<<if $job.breakRoomToday and $time >= 1 and $time <= 5>>
<<set $job.breakRoomToday = false>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _internImg = "images/characters/npc/office_intern" + random(1, 8) + ".jpeg">>
<<set _breakLines = [
"One of the interns is at the coffee machine when you duck into the break room, stretched up on her toes to reach the good mugs on the high shelf. She gives you a quick smile over her shoulder and goes back to it.",
"An assistant is bent at the little fridge, sorting her lunch from everyone else's, the line of her skirt drawn tight as she leans. She straightens when she hears you and holds the door of it open in offer.",
"An intern is perched on the edge of the counter, phone in hand, one heel hooked on the cupboard below, skirt riding where she isn't thinking about it. She glances up, unbothered, and looks back down.",
"The break room is empty but for an assistant doing something complicated to the coffee machine, sleeves pushed up, blouse pulled loose from the reach. She blows the hair out of her face and asks if you know how the filter comes out. You don't.",
"An intern is at the water cooler as you come in, tipping her head back for the little paper cup, the long line of her throat and everything under it caught in the strip lighting. She crushes the cup, drops it, and is gone before you've quite collected yourself."
]>>
<div class="char-scene">
<img @src="_internImg" class="char-img">
<div class="char-text">
<<= _breakLines.random()>>
<span class="arousal">Arousal increased.</span>
</div>
</div>
<</if>>
<</if>><<clockIn>>
/* Define flirt gates after assisant unlocked */
<<set _flirtGate to [8, 16, 24]>>
/* Assistant: First meeting trigger at L4 + Seed stages before L5 and cooldown days between + Reunion at L5 + Flirts after unlock */
<<if $job.level >= 4 and not $assistant.met>>
<<goto 'Assistant, Meet'>>
<<elseif $assistant.met and not $assistant.unlocked and $assistant.seedStage < 4 and ($gameDay - $assistant.lastSeedDay) >= 2>>
<<set _seedTarget to "Assistant, Seed " + ($assistant.seedStage + 1)>>
<<goto _seedTarget>>
<<elseif $job.level >= 5 and $assistant.met and not $assistant.unlocked and $assistant.seedStage >= 4>>
<<goto 'Assistant, Reunion'>>
<<elseif $assistant.unlocked and $assistant.flirtStage < 3 and $assistant.influence >= _flirtGate[$assistant.flirtStage] and ($gameDay - $assistant.lastFlirtDay) >= 3>>
<<set _flirtTarget to "Assistant, Flirt " + ($assistant.flirtStage + 1)>>
<<goto _flirtTarget>>
<<elseif $assistant.unlocked and not $assistant.affair and not $assistant.tripPending and $assistant.flirtStage >= 3 and $assistant.influence >= 30 and ($gameDay - $assistant.lastFlirtDay) >= 3 and ($gameDay - $assistant.lastTripOfferDay) >= 5>>
<<goto 'Assistant, Trip Offer'>>
<</if>>
<h2><<print passage()>></h2>
/* Pick a description set based on job title */
<<switch $job.title>>
<<case "Junior Software Engineer">>
<<set _descriptions = [
"You spend the morning chasing a bug in a payment flow nobody above your pay grade wants to touch. The original author left before you arrived and half the comments are in a language you don't read. By lunch you've narrowed it to a single function older than the company's current logo. You patch it, push the fix, and watch a senior carry it into a meeting you weren't invited to. Your name isn't on the ticket when it closes.",
"A queue of small, unglamorous fixes eats the morning. A man with a visitor badge and a government-issue lanyard comes down from a floor your card won't open, hands a team lead a sealed drive, and is gone before anyone introduces him. You go back to a date-format bug on a dashboard whose client is listed only as a contract number. You've never once seen a client's actual name written down in this building.",
"The planning meeting opens with the quarterly slogan and a slide of numbers nobody explains. Renewals up. A new 'defense and analytics' line that wasn't there last quarter. Your team is asked to absorb a small additional scope from a division you've never been told the function of, with no extra headcount. The afternoon disappears into unit tests for a service whose purpose was described to you in one sentence and a non-disclosure agreement.",
"A senior pulls you into pair programming on something that has a code instead of a name. He explains the function he needs and refuses to explain what it feeds, then closes the repo the moment you stand up. In the second you saw it, the folder tree read like the inside of a missile: guidance, telemetry, payload. You write the function. It's clean work. You don't ask.",
"The printer eats your architecture diagrams again. You wrestle the tray open and somehow knock half your coffee across your pants in the process. The intern, newer than you and already less impressed, watches without comment. You spend the rest of the day in a damp brown stain and the smell of stale espresso, fixing a parser written by someone since promoted above you.",
"You build a small internal tool a senior architect demanded by message at 2 a.m. Before lunch the same architect says it's been deprioritized, please disregard. Your branch sits untouched. By the time you log off, the architect is asking someone else for something new with the same urgency, in the same channel, and you notice that nobody here ever explains why a thing is wanted, only how fast."
]>>
<<case "Software Engineer">>
<<set _descriptions = [
"You own real tickets now, your name on them from the start. This morning you trace a data pipeline you maintain back toward its source and find it doesn't begin inside the company at all. The records arrive pre-collected, from a vendor named like a law firm, already tagged by location and device and movement. You were told you were cleaning the data. You were never told it was gathered from people who don't know the company exists.",
"You get partial read access to the unnamed program. The fragments you saw as a junior have a shape now: ingestion, then enrichment, then a stage called matching that cross-references one dataset against another you aren't cleared to open. The inputs are phone identifiers and coordinates from places that turn up in the news with the word conflict attached. You write your part well, and try not to follow the arrow past the edge of your access.",
"A standup runs long over a slipped client deliverable. Nobody says the client. The deliverable is described purely in capability: what it can find, how fast, at what confidence, from how little. You catch yourself genuinely absorbed in the problem, sketching the architecture in your notebook, before you remember to wonder who is on the other end of the word 'find.'",
"You're loaned to a sister team to help untangle a build issue, and their work isn't software at all, or not only. There's hardware in their lab behind glass, components for something that flies, schematics stamped with an export-control warning you have to sign just to stand near. You fix their build. You understand almost nothing of what you saw, and you suspect that separation is the entire point of how this place is laid out.",
"Your manager takes you for the kind of coffee that means something. He says you're trusted now, that the people upstairs like that you don't ask questions that slow things down. He means it warmly and you take it warmly, the small clean hit of being seen. It's only on the walk back to your desk that the sentence turns over in your head and shows you its other side."
]>>
<<case "Senior Software Engineer">>
<<set _descriptions = [
"Your card reaches the floor above now and most days you have reason to use it. The quieter work lives up here. Today it's a tuning pass on the matching engine: feed it a fragment of a person, a number, a face, a pattern of movement, and it returns the rest, where they are, who they're near, where they'll likely be next. You're told it keeps clients safe. You stopped believing the things you're told and kept building them anyway, cleanly, on time.",
"A client escalation reaches you stripped of every name on its way down. What's left is a complaint that the system locates its subjects too slowly under load, in a region currently thick with soldiers and reporters. You spend the day making it faster. You're good at it. The better you make it, the more clearly you see that the skill and the unease are the same muscle, and only one of them gets you paid.",
"You sit in a review for a capability that has no name, only a spec, and you finally ask the question you keep swallowing: what happens to the output once it leaves us. The room goes politely quiet. The director who recruited you smiles and says the architecture is sound, let's stay focused. You stay focused. But you clocked who looked down at the table when you asked, and who looked at you, and the second list was the shorter one.",
"Half the floor up here isn't even your discipline. One group does nothing but locate, work commissioned by people with no business cards and email addresses that are mostly numbers. Another group's deliverables physically leave the building in crates. The official line is that the company merely finds things and builds things, and what the clients do afterward is a question above everyone's clearance, including, conveniently, the people asking.",
"You walk two mid-levels through their first work on the program, telling them only what they need and closing the repo when they stand up, exactly the way it was once done to you. One asks what the matching is for. You give the answer you were given. You watch them decide whether to push, and watch them decide not to, and you understand the machine a little better than you did at breakfast. It runs on people choosing not to finish the question."
]>>
<<case "Lead Engineer">>
<<set _descriptions = [
"You run a team on the floor above now, and in the rooms you're allowed into the clients have names. The names are worse than the silence was. This morning you sit across a table from people who speak about a population the way you once spoke about edge cases, and you translate what they want into a sprint plan. By the time you leave the room it's just engineering again. That's the only trick you've found for staying in the chair.",
"A new contract: a consumer technology company everyone has heard of wants a surveillance layer built quietly enough that it never surfaces in a product announcement. They have the users. They lack the stomach to build the watching themselves, so they pay you to, at arm's length, through a subsidiary with a clean and meaningless name. You scope it. It's elegant. You hate how elegant you can make it.",
"Budget season. The capability you helped build is presented as a growth line, and executives discuss expanding the locating service into a new market the way they'd discuss a feature flag. You're asked for an engineering estimate. You give an honest one. It's a good number, and it earns you a nod from a man whose name you now know and wish you didn't, and the approval lands somewhere in you that you'd rather it had missed.",
"An incident pulls you in before dawn. The system surfaced someone it shouldn't have, or surfaced them to the wrong client, and which of those it was changes nothing about the cleanup. You spend the day making it never have happened: no ticket, no postmortem anyone off this floor will read. As finally you get up from your desk, you can't recall the last conversation you had that wasn't about containment.",
"A junior on the floor below, the kind you used to be, sends a careful message asking to be considered for the program. They think it's the interesting problem. They're right, it is. You sit with the message a while. Then you reply that you'll keep them in mind, and you mean it, and the fact that you mean it is the part that rides home with you."
]>>
<<case "Engineering Manager">>
<<set _descriptions = [
"You don't write much code now. You manage the people who do, and the thing they build carries your design even when your hands are nowhere near it. Today is one-on-ones, six of them, each engineer sharp and earnest and a little proud, none of them holding the whole picture. You hold it. Six times you decide how much to hand over, and six times you decide on less, and you tell yourself it's mercy.",
"A seat at the table, the corner office, the calm register where the real decisions get made. A client wants something that crosses a line even this place mostly pretends to keep: locating done inside a country the company isn't supposed to operate in, for a private outfit that fields its own soldiers. You contribute, usefully, because that's what the seat is for. Far below, on the floor you started on, someone is fixing a date-format bug and has no idea you exist.",
"Headcount review. You decide who gets pulled up to this floor and who stays below, which means you decide who learns what the company actually is and who is spared it. You choose the ones who can carry it, you tell yourself, but you know you're really choosing the ones who won't ask. You can read the difference at a glance now. That instinct used to be the thing you most disliked about the people who once sat where you sit.",
"A reporter's email lands in your inbox, forwarded down with a single word: handle. The questions are close. Closer than anyone above you seems to believe, brushing against clients that span a foreign ministry, a domestic agency that doesn't advertise its address, and a technology company the public adores. You spend the day drafting a non-answer in the careful, capable language you taught yourself to write. You were going to build something everyone heard about. You did. They'll just never know it was yours.",
"A quiet day at the top, which has its own strangeness. In the afternoon you walk the floor below, the one with the carpet the color of cold coffee, and a junior you don't recognize gives you the wary nod people save for someone from upstairs. You remember being that nod. You remember the man who sat at that desk before the weight and the lost savings and the seat at the table. You take the lift back up. The card still works."
]>>
<<default>>
<<set _descriptions = [
"The workday passes."
]>>
<</switch>>
<<print _descriptions.random()>>
<br><br>
/* Worked with too high arousal */
<<if $job.distractedToday>>
<span class="warning">Your head wasn't in it today. Too horny to focus, and it showed. <strong>No progress toward a promotion.</strong></span>
<br><br>
<</if>>
/* Passive drain: flavor only, the energy hit already landed in clockIn.
Lines split by seniority so a Lead isn't shifting desks. */
<<if $job.drainType == "passive">>
<<if $job.level >= 4>>
<<set _drainLines = [
"A client escalation with no name on it swallows the afternoon, three back-to-back calls where you say the same reassuring nothing in three different registers. You leave wrung out.",
"You spend hours you'll never recover chairing a 'quick alignment' between two teams who despise each other, translating each side's contempt into something the other can sign off on.",
"A junior's mistake lands on your desk to make disappear before anyone above notices. No ticket, no thanks, just a long quiet afternoon of cleanup and a headache to take home.",
"Budget review runs three hours over. By the end you've defended headcount you don't care about to people whose names you're still not sure of, and there's nothing left in the tank."
]>>
<<else>>
<<set _drainLines = [
"Half the afternoon vanishes into helping shift the whole row of desks two meters left for a floor plan nobody asked for. You leave with your back complaining and nothing to show for it.",
"You get volunteered to onboard a new hire who asks the same three questions in rotation until the light outside has gone.",
"A senior dumps a merge conflict on you an hour before end of day, the kind with someone else's undocumented mess all through it. You untangle it, uncredited, long past when you meant to leave.",
"IT reimages your machine mid-morning and you spend the rest of the day reinstalling everything from scratch, achieving precisely nothing anyone will ever see."
]>>
<</if>>
<<run _drainLines.push(
"A production incident eats the day. By the time it's contained you've forgotten what you actually came in to do.",
"A server migration goes sideways and you spend hours babysitting a progress bar that keeps resetting to zero."
)>>
<<= _drainLines.random()>> <span class="bad">You're extra worn out from working today.</span><br><br>
<</if>>
/* Workday opportunity, surfaced under the day's description */
<<if $job.eventToday>>
<<if $job.level >= 4>>
<<set _mode = "participant">>
<<elseif $job.level == 3>>
<<set _mode = "complicit">>
<<else>>
<<set _mode = "witness">>
<</if>>
/* Shared gif pool. Each type carries only the tiers it actually supports.
Omit a tier entirely (or leave its array empty) and it drops out of the
pool automatically for that mode. No empty-string placeholders. */
<<set _office = {
bj: {
gifs: ["office_bj1.gif","office_bj2.gif","office_bj3.gif","office_bj4.gif","office_bj5.gif","office_bj6.gif","office_bj7.gif","office_bj8.gif","office_bj9.gif"],
texts: {
witness: ["A quick peek through the doorway reveals the assistant kneeling beside the chair, the executive gripping the armrests with a strained smile.", "You glance inside and immediately look away again as the woman under the desk keeps her boss far too distracted to notice you."],
complicit: ["You step into the office to ask a question and stop cold when you realize the intern's hand is already busy beneath the desk.", "The executive barely looks up as you open the door, too occupied with the woman kneeling between his legs to care.", "You open the private office expecting a meeting and instead find the secretary on her knees while her boss exhales sharply above her.", "The door clicks open, and for one stunned second, everyone freezes except the woman already wrapped around him."],
participant: ["You lead the assistant into the vacant corner office, where the day's pent up tension is finally relieved.", "You lock the office door behind the intern, and drop into a chair while explaining what you need her to do.", "You close the office door behind the assistant, and she gives you a teasing smile before slowly sinking to her knees."]
}
},
grope: {
gifs: ["office_gr1.gif","office_gr2.gif","office_gr3.gif"],
texts: {
witness: ["Through the half-open blinds, you catch the manager pressed against his intern while wandering hands slip beneath her clothing.", "You pause outside the office door just long enough to see a manager tangled close to his intern. He hushes her while cupping a feel."],
complicit: ["The moment the door opens, both of them turn toward you without stopping, her blouse still half undone beneath his hands.", "You pause outside the office door just long enough to see a manager tangled close to his intern."]
/* no participant tier: grope stays an ambient sighting, not an arousal vent */
}
},
sex: {
gifs: ["office_h1.gif","office_h2.gif","office_h3.gif","office_h4.gif","office_h5.gif","office_h6.gif"],
texts: {
witness: ["The conference room lights are dim, but not enough to hide the rhythm of two bodies moving against the polished table.", "You freeze outside the office when you spot an intern with her executive partner, papers scattered across the floor beneath them."],
participant: ["The empty office stays quiet except for muffled gasps and the creak of office furniture as you pull the intern closer.", "You lead the assistant into the vacant corner office, where the day's pent up tension is finally relieved."]
/* no complicit tier */
}
},
hj: {
gifs: ["office_hj1.gif"],
texts: {
witness: ["A quick peek through the doorway reveals the assistant kneeling beside the chair, the executive gripping the armrests with a strained smile.", "You glance inside and immediately look away again as the woman under the desk keeps her boss far too distracted to notice you."],
complicit: ["You step into the office to ask a question and stop cold when you realize the intern's hand is already busy beneath the desk.", "The executive barely looks up as you open the door, too occupied with the woman kneeling between his legs to care."],
participant: ["You lock the office door behind the intern, and drop into a chair while explaining what you need her to do.", "The intern kneels beside your desk in the empty office, looking up at you while her hand slowly slides higher."]
}
}
}>>
/* Tease pool per tier */
<<switch _mode>>
<<case "witness">>
<<set _pool = [
{id:"w1", teaseImg:"", setup:"You catch a sound from an office down the hall that doesn't belong in a workplace."}
]>>
<<case "complicit">>
<<set _pool = [
{id:"c1", teaseImg:"", setup:"A door on the quiet floor sits open a crack, and there's movement behind it."}
]>>
<<case "participant">>
<<set _internImg = "images/characters/npc/office_intern" + random(1, 8) + ".jpeg">>
<<set _internLines = [
'//"Did you need anything else from me?"//',
'//"Anything else before I head off?"//',
'//"Is there something else you wanted?"//',
'//"Do you need me for anything else?"//',
'//"Was there anything else?"// she asks, lingering.',
'//"Anything else you need?"// she says, not quite turning to leave.'
]>>
<<set _pool = [
{id:"p1", teaseImg:_internImg, setup:"Some assistant lingers in the doorway after dropping off some files. " + _internLines.random()},
{id:"p2", teaseImg:_internImg, setup:"An intern you signed off on last month catches you alone by the printers and takes a beat too long over nothing. " + _internLines.random()},
{id:"p3", teaseImg:_internImg, setup:"An intern is still at her desk when the floor's gone quiet, and she looks up when you pass like she's been waiting for you to. " + _internLines.random()}
]>>
<</switch>>
<<if _pool.length > 0>>
<<set _scene = _pool.random()>>
<<if _pool.length > 1>>
<<for _i = 0; _scene.id === $job.lastWorkScene and _i < 5; _i++>>
<<set _scene = _pool.random()>>
<</for>>
<</if>>
<<set $job.lastWorkScene = _scene.id>>
/* Tease only. Payoff withheld until the player engages. */
<<if _scene.teaseImg !== "">>
<div class="char-scene">
<img @src="_scene.teaseImg" class="char-img">
<div class="char-text"><<= _scene.setup>></div>
</div>
<<else>>
<<= _scene.setup>>
<</if>>
<br>
<<set _validTypes = Object.keys(_office).filter(t =>
_office[t].texts[_mode] && _office[t].texts[_mode].length > 0
)>>
<<if _mode === "participant">>
<<link "Take her to an empty office." "Helion Dynamics, Event">>
<<set $job.eventToday = false>>
<<set $arousal = Math.max($arousal - 3, 0)>>
<<addSuspicion 1>>
<<set _t = _office[_validTypes.random()]>>
<<set $job.sceneGif = "images/h/office/" + _t.gifs.random()>>
<<set $job.sceneText = _t.texts[_mode].random()>>
<<set $job.eventOutcome = "engaged">>
<</link>>
<<else>>
<<link "Take a closer look." "Helion Dynamics, Event">>
<<set $job.eventToday = false>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _t = _office[_validTypes.random()]>>
<<set $job.sceneGif = "images/h/office/" + _t.gifs.random()>>
<<set $job.sceneText = _t.texts[_mode].random()>>
<<set $job.eventOutcome = "watched">>
<</link>>
<</if>>
<br><br>
<</if>>
<</if>>
/* Stay-late choice: accept for performance, decline for a nick to it.
Weekday version is career-only, no wife penalty by design. */
<<if $job.drainType == "late" and not $job.stayedLate>>
<<if $job.level >= 4>>A crisis lands at end of day and the room quietly expects you, of all people, to be the one who stays until it's put to bed.<<else>>Your manager catches you reaching for your coat. There's a deadline slipping, and he's asking, in the way that isn't really asking, if you can stay and see it through.<</if>>
<br>
<<if $energy >= 1>>
<<link "Stay late and grind it out." "Helion Dynamics, Workday">>
<<set $job.stayedLate = true>>
<<set $job.drainType = "">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $job.performance += 1>>
<</link>>
<br>
<<else>>
//You're running on empty. You couldn't give it another hour if you wanted to.//
<br>
<</if>>
<<link "Come up with a bad excuse and leave." $return>>
<<set $job.drainType = "">>
<<set $job.performance -= 1>>
<</link>>
<</if>>
<<if not ($job.drainType == "late" and not $job.stayedLate)>>
<<link "Clock out for the day." $return>><</link>>
<</if>><br><br>
''Elsewhere in the house''
<br>
<<if !tags().includes("bedroom")>>
<<link [[🛏️ Bedroom|Bedroom]]>><</link>><<if $wife.location == "bedroom">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("kitchen")>>
<<link [[🍳 Kitchen|Kitchen]]>><</link>><<if $wife.location == "kitchen">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("livingroom")>>
<<link [[🛋️ Living Room|Living Room]]>><</link>><<if $wife.location == "livingroom">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("bathroom")>>
<<if $wife.location == "bathroom">>
<<link [[🚿 Bathroom|Bathroom Door]]>><</link>> 👩🦰
<<else>>
<<link [[🚿 Bathroom|Bathroom]]>><</link>>
<</if>>
<br>
<</if>>
/* Only show "Around town" when it makes sense */
<<if $time < $timeMax>>
<br>
''Around town''
<br>
<<if $weekday <= 5 and $time <= 1>>
<<link [[💼 Helion Dynamics|Helion Dynamics]]>><</link>>
<<if $time == 1 and not $job.attendedToday>>
<span class="warning">- Time to work!</span>
<</if>>
<br>
<</if>>
<<link [[🏃 Canal Path|Canal Path]]>><</link>>
<br>
<<link [[🛒 Eastgate Plaza|Eastgate Plaza]]>><</link>>
<</if>><h1>Twelve Years Ago</h1>
The bleachers were full and you were watching the wrong half of the field. Down at the front, the cheer squad came out in formation, and one of them caught your eye and didn't look away. Blue and white. Red hair pulled tight. A smile that wasn't for the crowd.
<br><br>
She found you outside afterward, hair already coming loose. She said you looked like a guy who already knew how this story ended.
<br><br>
Her name was <<textbox "$wife.name" "Ashley">>.
<br><br>
You told her yours: <<textbox "$name" "Dave">>.
<br><br>
She was studying acting. You were on the boxing team and halfway through a computer science degree that bored you to tears. You were both broke in the temporary, beautiful way only college can make broke feel.
<br><br>
You talked through dinner with her friends and then through the long walk back to her dorm. She didn't tell you to leave at her door.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro1.jpeg" width="100%">
</div>
<br>
Sex came easy in those days, and often. She'd come back from practice still in her uniform and lock the door behind you.
<br><br>
You were going to do everything. She would be on a stage by twenty-five. You would build something everyone heard about. You said it out loud to each other in cheap apartments and on long drives and in the kitchens of friends who would later stop calling.
<br><br>
You believed every word of it. So did she.
<br><br>
<<link "Continue." "Intro 2">><</link>><h1>The Years Between</h1>
You graduated. She graduated. You took the job your professor told you to take, in a building that smelled of carpet glue, and you wrote code that nobody outside the company would ever see. She got headshots done. She auditioned for things and didn't get them, then auditioned for things and got them, mostly background work, mostly unpaid.
<br><br>
Three years in, you had an idea you couldn't stop thinking about, and you knew, the way you'd known at twenty, that it was the one.
<br><br>
You raised a little. Then a little more. You hired two people, then four, then six. The runway got longer. The pitch got tighter. You lost weight from skipped meals and slept on the office couch more nights than you slept at home.
<br><br>
$wife.name went to fewer auditions. Then to a callback she didn't get, and another, and another. She stopped telling you about them.
<br><br>
She told you about the baby on a Tuesday. You remember it was a Tuesday because you had a board meeting on the Wednesday. You bought the house that summer. A small place with trees in the front yard, blocks from a park where she pictured pushing a stroller. $wife.name picked it. She said it had good light.
<br><br>
The baby came. You met your investors that morning. You held your son that afternoon. You were back at the office before he was a week old.
<br><br>
The startup had eighteen months left in it. You spent ten of them telling yourself the next quarter was the one. $wife.name took your son to his first doctor's appointment, and his second, and his first day at a daycare you couldn't afford and signed up for anyway. You don't remember what she looked like in any of those months. You weren't really there.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro2.jpeg" width="100%">
</div>
<br>
The company went under in a way you'd watched other people's companies go under. You'd always thought you'd see it coming. You didn't.
<br><br>
When the dust cleared, the savings were gone, the house was gone, and your son was almost two and didn't really know you.
<br><br>
$wife.name didn't say much. There was nothing to say.
<br><br>
<<link "Continue." "Intro 3">><</link>><h1>Now</h1>
The apartment is small. Two bedrooms, if you're generous about what a bedroom is. The radiators clank. The neighbor upstairs has a child the same age as your son, and you can hear both of them most mornings, before the kettle is on. Half the boxes are still in the hallway.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro3.jpeg" width="100%">
</div>
<br>
You took the job at Helion Dynamics six weeks ago. Junior Software Engineer. A hundred a day. You sit in row three of an open plan office in a building off the bypass, and you write code for things you don't understand for clients you've never been told the names of. The carpet is the color of cold coffee. You aren't allowed onto the floor above.
<br><br>
$wife.name now works as a waitress, feeling like the cliché of a failed actress. Daycare costs more than her shifts pay. The math doesn't work, and you both pretend not to notice.
<br><br>
You've put on thirty pounds. You can feel it on the stairs and in the mirror. The boxing gloves you used to own are in a box somewhere, or they aren't. You haven't looked yet.
<br><br>
Rent is due Sunday. The fridge is mostly empty. Your son will be home from daycare at five.
<br><br>
It is Monday morning. You should be on your way to work in an hour.
<br><br>
You haven't decided yet whether this is the rest of your life. Maybe it is. Maybe it's just the bottom, and the bottom is only the bottom if you stay there.
<br><br>
Nobody is going to hand you the way back. Whatever you want from here, the money, her trust, your own reflection, you take it the hard way or not at all.
<br><br>
You earn it.
<br><br>
<<link "Begin." "Bedroom">>
<<set $gameRunning to true>>
<</link>><h2><<print passage()>></h2>
<<include 'Kitchen, Description'>>
<<include 'Kitchen, Triggers'>>
<<include 'Kitchen, Basics'>>
<<include 'House, Transport'>>/* Cooking State */
<<if $chores.kitchen>>
The countertop is clear, utensils set within easy reach.
<<else>>
The counter is cluttered, tools and dishes left where they were used.
<</if>>
/* Weekend late-morning breakfast together (both in the kitchen) */
<<if $weekday >= 6 and $time == 1 and $wife.location == "kitchen">>
<br>
<<if $wife.mood < 0>>
//$wife.name is making her own breakfast, and the set of her shoulders says she'd rather do it alone.//
<<elseif $energy < 1>>
//You're too drained to put a proper breakfast together.//
<<else>>
<<link "Make a slow weekend breakfast together." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<</if>>
/* Cook (Early Evening only) */
<<if $time == 5>>
<br>
<<if $energy < 1>>
//You're too drained to cook dinner.//
<<else>>
<<link "Cook dinner for everyone." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $wife.cookedToday = true>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<<elseif $time > 5>>
<br>
//Dinner's long done. Nothing to cook now.//
<<elseif $time > 0 and not ($weekday >= 6 and $time == 1)>>
<br>
//Too early to start on dinner.//
<<elseif $time == 0 and $weekday >= 6>>
<br>
//Too early to think about food.//
<</if>>
/* Eat together (weekday mornings) */
<<if $time == 0 and $weekday <= 5>>
<br>
<<if $wife.mood <= -2>>
//There is no breakfast on the table. $wife.name had hers before you were up, and the plate is already in the sink.//
<<else>>
<<link "$wife.name has made breakfast. Eat together." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<</if>>/* Base description */
A modest kitchen with a wooden table at its center and chairs around it. On the countertop, the coffee maker sits beside the kettle. The fridge hums quietly. A window above the sink looks out onto the backs of the apartments across the way.
/* Time */
<<switch $time>>
<<case 0>>Early morning light spills across the counter, catching on the rim of an empty mug left from the night before.
<<case 1>>Late morning settles into the kitchen, the smell of coffee still faint in the air, a sippy cup drying upside down by the sink.
<<case 2>>Midday sun rests flatly on the table, the room quiet and still.
<<case 3>>The afternoon hangs heavy and still, dust turning slowly in the light by the window.
<<case 4>>Late afternoon warms the table in tired gold, the light over the building across the way slowly thinning.
<<case 5>>Early evening softens the kitchen, the light through the window turning amber on the apartments across the way.
<<case 6>>Evening settles over the kitchen, the overhead light catching the smell of dinner lingering in the air.
<<case 7>>Late evening settles over the block, the windows opposite dark but for one or two still lit.
<<case 8>>Night presses against the window, the block dark beyond the glass, and the kitchen feels smaller under the overhead light.
<</switch>>
/* Chore */
<<if $chores.kitchen>>
<span class="good">The counters are wiped down, dishes put away, the table cleared.</span>
<<else>>
<span class="warning">Dishes sit stacked in the sink, a half-eaten toddler plate among them, and crumbs scatter the table where no one bothered to wipe.</span>
<</if>>
/* Kitchen Chore */
<<chore "kitchen" "Clean the kitchen.">>
<br><br><<if $wife.location == "kitchen">>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualDay1.jpeg', 'images/characters/w/w_casualDay2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is here, moving around the counter. She glances over when you come in.
<<elseif $wife.mood == 0>>
$wife.name is here, moving quietly around the counter.
<<else>>
$wife.name is here, working at the counter without looking up.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "kitchen">><h2>With $wife.name</h2>
<<set $wife.lazyMorningToday = true>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<moodShift 1>>
<<careCredit>>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_lazymorning1.jpeg', 'images/characters/w/w_lazymorning2.jpeg','images/characters/w/w_lazymorning3.jpeg')" width="100%">
</div>
<br>
<<if $wife.relationship >= 50>>
You climb back under the covers and she folds into you without a word, her head on your chest, the morning in no hurry to start. For a while there's nothing to fix and nowhere to be, just her breathing slowing against you and the light moving across the ceiling.
<<elseif $wife.relationship >= 25>>
You slide back in beside her and she lets you, settling her back against your chest. Neither of you says much. It's easy in a way mornings haven't been in a while, and she doesn't pull away though the boy could wake any minute.
<<else>>
You get back under the covers and, after a moment, she shifts to make room rather than turning away. You lie there in the quiet, not talking, the small distance between you a little smaller than it was.
<</if>>
<br><br>
<<link "Get up." $return>><</link>><h2><<print passage()>></h2>
<<include 'Living Room, Description'>>
<<include 'Living Room, Triggers'>>
<<include 'Living Room, Basics'>>
<<include 'House, Transport'>>/* Relax */
The sofa faces the TV. Somewhere to sit and let an hour go by.
<br>
<<if $time >= $timeMax>>
//It's too late to properly unwind now.//
<<else>>
<<link "Pass some time in front of the TV.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<if random(1, 100) <= 50>>
<<goto "TV">>
<<else>>
<<goto $return>>
<</if>>
<</link>>
<</if>>
<br><br>
<<if $items.yogaMats>>
A pair of yoga mats rest in the corner, rolled out and ready.
<br>
<<workout "Do some yoga." 1 1 1 0 1>>
<<else>>
The corner stands empty, open space against the wall.
<br>
//You could use a set of yoga mats here, something simple for a quiet workout at home.//
<</if>>
<<soloVent "livingroom">>/* Base description */
A living room with a sofa facing the television and an armchair angled beside it. A coffee table sits in the middle, a low bookshelf against the far wall. A window looks out onto the street below.
/* Time */
<<switch $time>>
<<case 0>>Early morning light creeps across the floor, the room still and the television dark.
<<case 1>>Late morning settles into the room, a forgotten cartoon paused on the screen from the day before.
<<case 2>>Midday sun pools on the rug, the air warm and unmoving.
<<case 3>>The afternoon hangs heavy and still, sunlight catching the dust above the coffee table.
<<case 4>>Late afternoon stretches across the floor in long bars of gold, the room quiet and waiting.
<<case 5>>Early evening light fades from the street outside, the lamps not yet switched on.
<<case 6>>Evening settles over the room, a single lamp warm against the gathering dark.
<<case 7>>The late evening is slightly illuminated by the streetlamps.
<<case 8>>Night presses against the window, the room lit only by the soft glow of a single lamp.
<</switch>>
/* Chore State */
<<if $chores.livingroom>>
<span class="good">Cushions are straightened, toys put away, the coffee table clear.</span>
<<else>>
<span class="warning">Toys lie scattered across the rug, a blanket bunched on the sofa, mugs left ringing the coffee table.</span>
<</if>>
/* Living Room Chore */
<<chore "livingroom" "Tidy the living room.">>
<br><br><<if $wife.location == "livingroom">>
/* Wife doing yoga */
<<if $wife.doingYoga>>
<div class="char-scene">
<img @src="either('images/characters/w/w_yoga1.jpeg', 'images/characters/w/w_yoga2.jpeg', 'images/characters/w/w_yoga3.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name has the mats out, moving through her stretches in the cleared space by the wall. She catches you watching and carries on, unbothered by the audience.
<<elseif $wife.mood == 0>>
$wife.name has the mats out, working through her yoga by the wall, breathing slow and even.
<<else>>
$wife.name is on the mats with her back to you, moving through her stretches, making it plain she'd rather not be interrupted.
<</if>>
<<if not $wife.yogaViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
<br>
<<if $wife.mood >= 0>>
<<if $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<br>
<<elseif $arousal >= 8>>
//You're in no state to focus on stretching beside her.//
<br>
<<elseif $energy < 1>>
//You're too drained to join in.//
<br>
<<else>>
<<link "Join her for a session." $return>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $fitness += 1>>
<<set $wife.relationship += 2>>
<<moodShift 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<</link>>
<br>
<</if>>
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if not $wife.yogaViewedToday>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $wife.yogaViewedToday = true>>
<</if>>
/* Wife Tidying */
<<elseif $wife.tidyToday>>
<<set $wife.tidyToday = false>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualBent1.jpeg', 'images/characters/w/w_casualBent2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is gathering the kid's toys off the rug, bent over by the sofa with one arm buried beneath it, chasing something just out of reach.
<<elseif $wife.mood == 0>>
$wife.name is clearing the toys scattered across the rug, by the sofa with one arm stretched right under it after a stray one.
<<else>>
$wife.name is picking up after the kid, bent down by the sofa and reaching under it without a word to you, the set of her shoulders making it plain she'd rather you weren't watching.
<</if>>
<span class="arousal">Arousal increased.</span>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
There's a whole second toybox under here, I swear. Don't just stand there enjoying the view, lend me a hand.
<</speech>>
<<elseif $wife.mood == 0>>
<<speech "Wife" $wife.name>>
Why does everything end up under here. Every single time.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Don't mind me. Someone has to do it.
<</speech>>
<</if>>
/* Wife on the couch */
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualRelax1.jpeg', 'images/characters/w/w_casualRelax2.jpeg', 'images/characters/w/w_casualRelax3.jpeg', 'images/characters/w/w_casualRelax4.jpeg', 'images/characters/w/w_casualRelax5.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is on the couch. She looks up briefly when you come in.
<<elseif $wife.mood == 0>>
$wife.name is sitting on the couch.
<<else>>
$wife.name is on the couch, her eyes fixed somewhere across the room.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<</if>>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "livingroom">><h2>Her Place</h2>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<sexEnergy 1>>
<<set $ex.pending = false>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<<set _gifs = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _gifs.push("ons" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/ons/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"You knock once and she opens the door without a word. Clothes come off fast. You push her against the wall, yank her jeans down, and drive your cock into her wet pussy in one hard thrust. She gasps and grabs your shoulders as you fuck her standing, hips snapping forward, skin slapping loud with every stroke. Her cunt grips you tight. A few minutes later in the bedroom, you bend her over the bed, and slam into her from behind, one hand fisted in her hair while the other works her clit. She moans and pushes back against your thrusts. You flip her onto her back, spread her legs wide, and pound deep, watching her tits bounce as your cock stretches her open. She claws your back and comes hard. You keep thrusting until you flood her insides. She lies there catching her breath while you pick up your clothes.",
"She buzzes you up, and clothes are already coming off as you move toward the bedroom. She drops to her knees the moment you reach the bed and takes your cock in her mouth. Her tongue works along the shaft while her lips slide up and down. She looks up once, then takes you deeper until you feel the back of her throat. After a few minutes she pulls off, climbs onto the bed, and straddles you. She grabs your cock, lines it up, and sinks down until you're buried inside her. Her hips start rolling, grinding and bouncing, her pussy gripping tight with every movement. She leans forward, hands on your chest, riding faster, her tits swaying above you. You grip her ass and thrust up to meet her, driving deeper each time she drops. She moans louder and slams down harder. Her cunt clamps around your cock as she comes. You keep thrusting from below until you can't hold back either. She stays on top for a moment, breathing heavy, then rolls off onto the sheets. You stand and start pulling on your clothes while she reaches for her phone."
]>>
<<= _scene.random()>>
<br><br>
<<link [[Slip out and head home.|Living Room]]>><</link>><h2>Round Two?</h2>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
/* She sends a picture with the text. Avoid an immediate repeat, save it. */
<<set _ons = []>>
<<for _i = 1; _i <= 8; _i++>>
<<set _ons.push("ons_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _ons = _ons.filter(f => f !== $ex.lastNudeImg)>>
<<set _pick = _ons.random()>>
<<set $ex.lastNudeImg = _pick>>
<<set _img = "images/characters/npc/" + _pick>>
<<set _cap = "She was hungry for more. Day " + $gameDay + ".">>
<<galleryAdd _img _cap>>
Your phone goes again, and this time you're the only one who sees it. It's her, the girl from the Anchor you went home with and don't remember giving your number to.
<br><br>
<div class="chat">
<div class="bubble in">still got that itch 😉 you free?</div>
</div>
<br>
<div class="intro-image"><img @src="_img" width="100%"></div>
<span class="good">Saved to your gallery.</span>
<br><br>
''What do you do?''
<br>
/* EXTENSION POINT
Wire "Go see her" to a repeat-hookup scene mirroring Anchor ONS:
advance time, drop arousal, call <<addSuspicion 3>>, then route there.
For now it just returns. */
<<link "Go see her." "ONS Ex Hookup">>
<</link>>
<br>
<<link "Block the number for good." $return>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<</link>>
<br>
<<link "Leave it. Maybe another time." $return>>
/* stays live, will surface again */
<</link>><h2>The Phone on the Table</h2>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
<<set $ex.scares += 1>>
/* Her growing wariness. Raw bump, escalating each scare. Deliberately not
<<addSuspicion>>, since this is her noticing, not a fresh cheat. */
<<set $wife.suspicion += $ex.scares>>
<<moodShift -1 -1>>
<<set _excuse = [
"someone from work chasing a ticket",
"a wrong number, some kid texting the wrong guy",
"spam, one of those delivery scams going around"
].random()>>
You left your phone face up on the table. It lights up and buzzes its way halfway across the surface, and the preview sits there in plain sight for a second before you can move.
<br><br>
<div class="chat">
<div class="bubble in">hey it's the girl from the Anchor 😉 you ducked out before I could even get your name properly. was thinking about you. we should do that again sometime</div>
</div>
<br>
And there it is. The night comes back to you in pieces, the drinks, the walk, her hand on your arm, and somewhere in the haze of it you'd given her your number and forgotten you'd ever done it. Sober you would never. Drunk you handed it over like a damned business card.
<<= $wife.name>>'s eyes get to the screen before yours do. You can't tell how much of the preview she caught, but you can see her reading your face for the answer, and your face is doing you no favors.
<br><br>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_suspicious1.jpeg', 'images/characters/w/w_suspicious2.jpeg')" width="100%">
</div>
<<if $ex.scares == 1>>
You reach over a beat too fast and tell her it's <<= _excuse>>. She holds your eye a second longer than you'd like, then lets it go. The lie sits between you, and you both feel its weight even if only one of you knows its shape.
<<else>>
You give her <<= _excuse>>, the same easy lie as last time, and you can see her setting it down next to the last one. She doesn't argue. She just looks at you, and that's worse than if she did.
<</if>>
<br><br>
''What do you do?''
<br>
<<link "Block the number for good." $return>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<</link>>
<br>
<<link "Delete the text, but keep her number." $return>>
<<set $ex.saved = true>>
<</link>>/* INFO */
<<set $name = "Dave">>
<<set $energyMax = 5>>
<<set $energy = $energyMax>>
<<set $money = 100>>
/* Fitness and workout variables */
<<set $fitness = 0>>
<<set $fitnessTier = 0>>
<<set $fitnessTierUp = false>>
<<set $fitnessTierDown = false>>
<<set $lastWorkoutDay = 0>>
<<set $fitnessWarning = false>>
<<set $fitnessWarningShown = false>>
<<set $foughtToday = false>>
/* Arousal System */
<<set $arousal = 0>>
<<set $arousalMax = 10>>
<<set $ventedToday = false>>
/* Other variables */
<<set $drunk = 0>>
<<set $onsToday = false>>
/* ITEMS / OWNERSHIP */
<<set $items = {
pc: false,
yogaMats: false,
wine: 0,
goodBed: false
}>>/* Setup $return and tag "noreturn" functionality */
<<if not tags().includes("noreturn")>>
<<set $return to passage()>>
<</if>>
/* TRIGGERS */
<<if $gameRunning>>
<<wifeSchedule>>
<<workCheck>>
<</if>><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Messages</div></div>
<div class="phone-screen">
<div class="phone-list">
<a class="phone-row" data-passage="Phone Wife">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$wife.name</div>
<div class="pr-prev"><<if $phone.wifeUnread>>Sent you a photo<<else>>Tap to message<</if>></div>
</div>
<<if $phone.wifeUnread>><div class="pr-badge">●</div><</if>>
</a>
<a class="phone-row" data-passage="Phone Friend">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$friend.name</div>
<div class="pr-prev"><<if $phone.friendUnread>>Sent you a message<<else>>Tap to message<</if>></div>
</div>
<<if $phone.friendUnread>><div class="pr-badge">●</div><</if>>
</a>
<<if $phone.gallery.length > 0>>
<a class="phone-row" data-passage="Phone Gallery">
<div class="p-avatar" style="background:#2c2c36;">🖼</div>
<div class="pr-body">
<div class="pr-name">Gallery</div>
<div class="pr-prev"><<= $phone.gallery.length>> saved<<if $phone.galleryNew > 0>> · <<= $phone.galleryNew>> new<</if>></div>
</div>
<<if $phone.galleryNew > 0>><div class="pr-badge">●</div><</if>>
</a>
<</if>>
<a class="phone-row" data-passage="Phone Services">
<div class="p-avatar" style="background:#2c2c36;">🧹</div>
<div class="pr-body">
<div class="pr-name">Services</div>
<div class="pr-prev"><<if $maid.active>>Cleaning active<<else>>Tap to arrange<</if>></div>
</div>
</a>
</div>
</div>
<div class="phone-foot"><<link "Put the phone away" $return>><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<<if $phone.friendPingTopic !== "">>
/* He texted first. Mark read on open; message stays until you reply. */
<<set $phone.friendUnread = false>>
<div class="chat">
<<switch $phone.friendPingTopic>>
<<case "anchor">>
<div class="bubble in">On my usual stool at the Anchor tonight if you can get out. Same as ever, brother.</div>
<<case "checkin">>
<div class="bubble in">You alive over there? Your name hasn't lit up my phone in a while.</div>
<<case "memory">>
<div class="bubble in">Drove past our old college bar today. Still standing, somehow. Like us, barely. Thinking of you, man.</div>
<<case "ribbing">>
<div class="bubble in">Reminder that I'm still undefeated at darts and you still owe me a rematch you're going to lose.</div>
<<case "lowkey">>
<div class="bubble in">No reason. Just checking the line's still open on your end. It is on mine.</div>
<</switch>>
</div>
<<if not $phone.friendTextedToday>>
<div class="phone-actions">
<<link "Reply" "Phone Friend Ping">>
<<set $phone.friendTextedToday = true>>
<<set $friend.relationship += 1>>
<</link>>
</div>
<<else>>
<div class="phone-note">You've replied to $friend.name today.</div>
<</if>>
<<elseif not $phone.friendTextedToday>>
<div class="phone-actions">
<<link "Text $friend.name">>
<<set $phone.friendTextedToday = true>>
<<set $friend.relationship += 1>>
<<set $phone.msgTopic = ["bored","checkin","gym","drink","memory","ribbing","advice"].random()>>
<<goto "Phone Friend Reply">>
<</link>>
</div>
<<else>>
<div class="phone-note">You've traded messages with $friend.name today already.</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<div class="chat">
<<switch $phone.friendPingTopic>>
<<case "anchor">>
<div class="bubble in">On my usual stool at the Anchor tonight if you can get out. Same as ever, brother.</div>
<div class="bubble out">Might just take you up on that.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Good. I'll get the first round in and lie about whose it was. Get down here.</div>
<<else>>
<div class="bubble in">Do. It's been too long since you actually showed.</div>
<</if>>
<<case "checkin">>
<div class="bubble in">You alive over there? Your name hasn't lit up my phone in a while.</div>
<div class="bubble out">Still here. Heads down lately. Sorry, man.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">No apology needed. I just like knowing you're upright. That's the whole job of an old friend, checking you're still vertical.</div>
<<else>>
<div class="bubble in">Don't go dark on me again, that's all. Line's open.</div>
<</if>>
<<case "memory">>
<div class="bubble in">Drove past our old college bar today. Still standing, somehow. Like us, barely. Thinking of you, man.</div>
<div class="bubble out">God, that place. We practically lived in that booth.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Best years on the worst budget. I'd trade a chunk of what I've got now to be that broke and that happy again. Don't tell my accountant.</div>
<<else>>
<div class="bubble in">Long time ago now. Good times, though. We should make some new ones before we're too old to remember the old ones.</div>
<</if>>
<<case "ribbing">>
<div class="bubble in">Reminder that I'm still undefeated at darts and you still owe me a rematch you're going to lose.</div>
<div class="bubble out">Big talk from a man I've watched miss the board entirely.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">One time. One time, eleven years ago, and you'll take it to my grave. This is exactly why I keep you around.</div>
<<else>>
<div class="bubble in">Talk's cheap. Anchor, darts, you and me. Prove it.</div>
<</if>>
<<case "lowkey">>
<div class="bubble in">No reason. Just checking the line's still open on your end. It is on mine.</div>
<div class="bubble out">It's open. Means more than you'd think, you reaching out.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I know it does. That's why I do it. You spent long enough thinking you had to earn the phone call. You don't. Never did.</div>
<<else>>
<div class="bubble in">Good. Keep it that way. Not everything has to be a whole production, man.</div>
<</if>>
<</switch>>
</div>
<<if $phone.friendPingTopic == "anchor">>
<<if $friend.drankToday>>
<div class="phone-note">You've already had your session with him tonight.</div>
<<elseif $time < 5>>
<div class="phone-note">He'll be on his stool tonight. Too early to head down yet.</div>
<<elseif $time >= $timeMax>>
<div class="phone-note">Too late to head down and meet him now.</div>
<<elseif $money < 16>>
<div class="phone-note">A couple of rounds with him is more than you can cover tonight.</div>
<<else>>
<div class="phone-actions">
<<link "Head down to the Anchor and meet him. ($16)" "Anchor Friend">>
<<set $phone.friendPingTopic = "">>
<<friendDrinkSetup>>
<</link>>
</div>
<</if>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">>
<<set $phone.friendPingTopic = "">>
<</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<div class="phone-note"><<= ["You text $friend.name, aware it's been a while. You're never quite sure how much of the old ease is left.","You tap out a message to $friend.name, already half-expecting the dry line you've got coming."].random()>></div>
<div class="chat">
<<switch $phone.msgTopic>>
<<case "bored">>
<div class="bubble out">Dying of boredom over here. Entertain me.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">You're texting a man who golfs on Tuesdays for fun, brother. We are not the entertainment we used to be. Tragic, really.</div>
<<else>>
<div class="bubble in">Ha. Join the club. Get yourself down the Anchor one of these nights and we'll fix that.</div>
<</if>>
<<case "checkin">>
<div class="bubble out">You alive?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Barely. Meetings all day with people who say "circle back" unironically. Good to see your name pop up, man. Means you're still upright.</div>
<<else>>
<div class="bubble in">Still here. Busy. You should come out, we never actually talk anymore.</div>
<</if>>
<<case "gym">>
<div class="bubble out">Trying to get back in shape. Don't laugh.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I would never. Proud of you, actually. The old you is in there under the takeout somewhere. Go dig him out.</div>
<<else>>
<div class="bubble in">About time. You used to be the fit one. Wild how that flips on a guy.</div>
<</if>>
<<case "drink">>
<div class="bubble out">We need a proper session soon.</div>
<<if ($weekday == 5 or $weekday == 6)>>
<div class="bubble in">Funny you should say it. I'm on my usual stool at the Anchor most of tonight. Get down here.</div>
<<else>>
<div class="bubble in">Weekend. Anchor. Same stool as ever. I'm not hard to find.</div>
<</if>>
<<case "memory">>
<div class="bubble out">Remember the road trip senior year? The car dying outside that diner?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Two days on gas-station hot dogs waiting on a tow that never came. Best forty-eight hours of my life, and I've owned a boat since. Tells you something.</div>
<<else>>
<div class="bubble in">Vaguely. That was a long time and a lot of brain cells ago, man. Good days, though.</div>
<</if>>
<<case "ribbing">>
<div class="bubble out">Admit it, you only keep me around to feel tall.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I keep you around because you knew me before the money and still pick up. Also yes, the height thing. Mostly the first one.</div>
<<else>>
<div class="bubble in">Ha. Something like that. Get yourself out for a pint and I'll insult you properly, in person.</div>
<</if>>
<<case "advice">>
<div class="bubble out">Straight question. You ever feel like you missed the version of your life where it all worked out?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Every damn day, brother. I hit the number and the feeling I was chasing wasn't in the account. You've still got the wanting. Don't waste it being miserable about the shape of it.</div>
<<else>>
<div class="bubble in">Heavy for a Tuesday. Yeah, sometimes. Everybody does. You're not as alone in it as you think.</div>
<</if>>
<</switch>>
</div>
</div>
<div class="phone-foot"><<link "Back" "Phone Friend">><</link>></div>
</div><<set $phone.galleryNew = 0>>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Gallery</div></div>
<div class="phone-screen">
<<if $phone.gallery.length == 0>>
<div class="phone-note">Nothing saved.</div>
<<else>>
<<for _i = $phone.gallery.length - 1; _i >= 0; _i-->>
<div class="phone-photo"><img @src="$phone.gallery[_i].img" width="100%"></div>
<div class="phone-cap"><<= $phone.gallery[_i].caption>></div>
<</for>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Services</div></div>
<div class="phone-screen">
<div class="phone-note">A local outfit that handles the cleaning, so the flat stays in order without you or $wife.name having to keep on top of it.</div>
<br>
<<if $maid.active>>
<div class="phone-note"><span class="good">Cleaning service active.</span> $<<print $maid.cost>> a week, billed weekly. The place stays tidy on its own.</div>
<div class="phone-actions">
<<link "Cancel the service" "Phone Services">>
<<set $maid.active = false>>
<</link>>
</div>
<<else>>
<div class="phone-note">A cleaner twice a week, $<<print $maid.cost>> a week. The chores stop being your problem, and the house stays clean enough that $wife.name has one less thing to hold against you.</div>
<<if $money >= $maid.cost>>
<div class="phone-actions">
<<link `"Hire the cleaning service ($" + $maid.cost + ")"` "Phone Services">>
<<set $money -= $maid.cost>>
<<set $maid.active = true>>
<<set $maid.lastBilled = $gameDay>>
<<set $chores.bedroom = true>>
<<set $chores.kitchen = true>>
<<set $chores.livingroom = true>>
<<set $wife.choreToday = true>>
<</link>>
</div>
<<else>>
<div class="phone-note">//You can't cover the first week ($<<print $maid.cost>>) right now.//</div>
<</if>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><<set _rp = Story.has($return) ? Story.get($return) : null>>
<<set _together = _rp ? _rp.tags.includes($wife.location) : false>>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<<if $phone.wifeUnread>>
<<if $phone.wifeMsgText !== "">>
<div class="chat">
<div class="bubble in"><<= $phone.wifeMsgText>></div>
<div class="bubble in">📷 Photo</div>
</div>
<<else>>
<div class="chat"><div class="bubble in">📷 Photo</div></div>
<</if>>
<div class="phone-actions">
<<link "Open photo" "Phone Wife Pic">>
<<set _img = "images/characters/w/" + $phone.wifePendingImg>>
<<if $phone.wifeMsgType == "lingerie">>
<<set _cap = "She sent this in the lingerie you bought her. Day " + $gameDay + ".">>
<<set _note = "She wanted you to see it again.">>
<<elseif $phone.wifeMsgType == "nude">>
<<set _cap = "She sent this out of nowhere. Day " + $gameDay + ".">>
<<set _note = "No prompting. She just sent it.">>
<<else>>
<<set _cap = $wife.name + " sent this. Day " + $gameDay + ".">>
<<set _note = "She really sent it.">>
<</if>>
<<set $phone.viewImg = _img>>
<<set $phone.viewNote = _note>>
<<galleryAdd _img _cap>>
<<set $phone.wifeUnread = false>>
<<set $phone.wifePendingImg = "">>
<<set $phone.wifeMsgType = "">>
<<set $phone.wifeMsgText = "">>
<</link>>
</div>
<</if>>
<<if _together>>
<div class="phone-note">She's in the room with you. You could just talk to her.</div>
<<else>>
<div class="phone-actions">
<<if not $phone.wifeTextedToday>>
<<link "Send a message">>
<<set $phone.wifeTextedToday = true>>
<<set $phone.msgTopic = ["checkin","kid","miss","groceries","tonight","restaurant","weekend","apology"].random()>>
<<goto "Phone Wife Reply">>
<</link>>
<<else>>
<div class="phone-note">You've messaged her today already.</div>
<</if>>
<<if $gameDay >= $intimacyUnlockDay and not $phone.nudeAskedToday and ($gameDay - $phone.lastNudeDay) >= $phone.nudeCooldown>>
<<link "Ask her to send something">>
<<set $phone.nudeAskedToday = true>>
<<if $wife.relationship >= 50 and $wife.mood >= 1>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _nudes = _nudes.filter(f => f !== $phone.lastNudeImg)>>
<<set _pick = _nudes.random()>>
<<set $phone.lastNudeImg = _pick>>
<<set $phone.lastNudeDay = $gameDay>>
<<set _img = "images/characters/w/" + _pick>>
<<set _cap = "She sent this when you asked. Day " + $gameDay + ".">>
<<set $phone.viewImg = _img>>
<<set $phone.viewNote = "You asked. She delivered.">>
<<galleryAdd _img _cap>>
<<set $phone.msgTopic = "nude_yes">>
<<else>>
<<set $phone.msgTopic = "nude_no">>
<</if>>
<<goto "Phone Wife Reply">>
<</link>>
<</if>>
</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<div class="phone-photo"><img @src="$phone.viewImg" width="100%"></div>
<<if $phone.viewNote !== "">>
<div class="phone-note"><<= $phone.viewNote>></div>
<<else>>
<div class="phone-note">She really sent it.</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone Wife">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<<if $wife.mood >= 1>>
<<set _intro = ["You catch a free minute and text her, just because. The thought of it lifts something small.","You thumb out a message to her. It's the kind of small reach you don't make often enough."]>>
<<elseif $wife.mood == 0>>
<<set _intro = ["You sit with the phone a moment, then text her. Ordinary, the way most days are now.","You tap out a message to her between one thing and the next, no particular weight to it."]>>
<<else>>
<<set _intro = ["You hesitate over the phone longer than you should, then text her anyway, bracing a little for how it lands.","You start and delete it twice before you send. Things have been thin between you lately."]>>
<</if>>
<div class="phone-note"><<= _intro.random()>></div>
<div class="chat">
<<switch $phone.msgTopic>>
<<case "checkin">>
<div class="bubble out">How's your day going?</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Surviving. The lunch rush was a circus. Nice to get a text that isn't the daycare for once.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Busy. You know how it is.</div>
<</if>>
<<case "kid">>
<div class="bubble out">How's the boy been today?</div>
<<if $wife.mood >= 0>>
<div class="bubble in">A menace. Drew on the wall again. Your side of the family, clearly.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Fine. Handful, as usual. I've got it.</div>
<</if>>
<<case "miss">>
<div class="bubble out">Thinking about you.</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Yeah? That's not like you. I'll take it though.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">That's nice. I'm up to my elbows here, but... thanks.</div>
<</if>>
<<case "groceries">>
<div class="bubble out">Need me to grab anything on the way back?</div>
<<if $wife.mood >= 0>>
<div class="bubble in">Milk. And whatever you're having, because I'm too tired to think about dinner. You're a lifesaver, actually.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Milk, if you remember. You usually don't.</div>
<</if>>
<<case "tonight">>
<div class="bubble out">What are you thinking for tonight?</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Boy down by seven, then the sofa and something trashy. Don't fall asleep on me this time.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Same as every night. I'll believe the "we'll do something" when I see it.</div>
<</if>>
<<case "restaurant">>
<div class="bubble out">How's the shift? Tell me it's dead in there.</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Slammed. A twelve-top that tipped in loose change and life advice. I'd rather be home losing the remote argument to you.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Busy. Feet are gone. Can't really be on my phone.</div>
<</if>>
<<case "weekend">>
<div class="bubble out">Should we try to do something this weekend? The three of us.</div>
<<if $wife.mood >= 0>>
<div class="bubble in">Look at you, planning. The park if it's dry, and you're on bag duty this time. Deal.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">If you actually mean it, sure. I've heard "this weekend" before, though.</div>
<</if>>
<<case "apology">>
<div class="bubble out">I know I've been hard to live with lately. I'm sorry. I'm working on it.</div>
<<if $wife.mood >= 0>>
<div class="bubble in">...That's not nothing. Thank you for saying it. Just let me see it too, alright?</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Okay. We'll see. Words have been cheap around here lately.</div>
<</if>>
<<case "nude_yes">>
<div class="bubble out">Send me something to get me through the day.</div>
<div class="bubble in">You're terrible. Lock your phone, for God's sake.</div>
<<case "nude_no">>
<div class="bubble out">Send me something. You know what I mean.</div>
<<if $wife.relationship >= 30>>
<div class="bubble in">Ha. Not today, tiger. Earn it first.</div>
<<else>>
<div class="bubble in">Are you serious? No.</div>
<<moodShift -1>>
<</if>>
<</switch>>
</div>
<<if $phone.msgTopic == "nude_yes">>
<div class="phone-photo"><img @src="$phone.viewImg" width="100%"></div>
<div class="phone-note"><span class="good">Saved to your gallery.</span></div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone Wife">><</link>></div>
</div><h2>Your Supporter Page</h2>
You pull up your project's page and check the numbers.
<br><br>
<<if $project.supporters > 0>>
<<print $project.supporters>> supporters, holding steady at $<<print $project.weeklyIncome>> a week. Not enough to quit anything over. Enough to feel like something you made is wanted.
<br><br>
''Recent activity''
<br>
<<set _names = ["xX_NightOwl_Xx", "GrumpyDad42", "anon_4417", "VelvetThunder", "tired_teacher", "lurkmaster99", "Sir_Reginald_III", "pixelpirate", "QuietStorm", "j_morrison", "GoonieX", "LumpY420", "basedBaby8", "Drunkencycle", "PrinceyDincey", "Shiggy", "KaxelAy", "SnyeSkark", "February_Fade", "Jameey", "bigkai542"]>>
<<set _comments = [
"keep it up, rare to see a dev who actually ships",
"the new build fixed my save bug. a hero, truly",
"take my money and just add more content",
"been here since v0.1, proud of you man",
"when's the next update dropping?? need it",
"worth every cent, don't burn out on us",
"finally a dev who reads the feedback",
"showed the game to my mom, but she didn't understand",
"soo psyched for next release!",
"are there any plans to add tentacles?!?!?!!?!",
"Is this game still getting updates? 👀 I find myself addicted to the game play, this has a lot of potential!",
"is there a way to auto max my stats",
"I know it is still in the early stages but seeing your game has an update got me excited. It is coming along really well. Poker night is interesting.",
"I like the improvements. Your game is coming along really well. <3",
"A lot of potential! No bugs so far, and I look forward to coming back and checking it out with each new update! Don't forget to take your time tho, and drink some water and rest! :)",
"more exhibitionism please!",
"How about actually researching Erotica instead of just feeding prompts in the AI, you pleb? Start with Aristotle's Poetics and return once you've learned this refined craft. There are no shortcuts to smut worth reading.",
"Why the hell does this work in progress game not have all features ready yet?!?!?!?!?!?!?!"
]>>
/* GENRE-tagged comments */
<<if $project.choices.genre === "broad">>
<<set _comments = _comments.concat([
"showed this to three friends and they all got it instantly",
"love that anyone can just pick this up and go",
"my kind of game, nothing gatekept about it"
])>>
<<elseif $project.choices.genre === "niche">>
<<set _comments = _comments.concat([
"niche as hell and i'm here for it, don't you dare go mainstream",
"finally something that isn't trying to please everyone",
"you get it. this is EXACTLY the thing nobody else makes"
])>>
<</if>>
/* PROTAGONIST-tagged comments */
<<if $project.choices.protagonist === "everyman">>
<<set _comments = _comments.concat([
"the MC actually feels like me, that's the whole appeal",
"love that the lead's just a normal guy for once"
])>>
<<elseif $project.choices.protagonist === "fantasy">>
<<set _comments = _comments.concat([
"the MC is such a legend, pure power fantasy and i love it",
"give me more of this larger-than-life lead",
"love all the fantastical horniness xD xD xD"
])>>
<</if>>
/* FEATURE-tagged comments */
<<if $project.choices.feature === "stats">>
<<set _comments = _comments.concat([
"the stat system has me in a chokehold, spreadsheet open and everything",
"min-maxing this is unreasonably satisfying",
"please never simplify the numbers, the depth is the point"
])>>
<<elseif $project.choices.feature === "variety">>
<<set _comments = _comments.concat([
"every update there's something new to stumble into, love it",
"the sheer amount of stuff to see keeps me coming back",
"so much variety, i keep finding scenes i missed"
])>>
<</if>>
<<set _picks = _comments.randomMany(3)>>
<<for _i = 0; _i < _picks.length; _i++>>
//<<= _names.random()>>//: <<= _picks[_i]>>
<br>
<</for>>
<br>
You could open the full dashboard over on <<link "FanForge">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>>, but there's not much more to see tonight.
<<else>>
The page is live, but it's quiet. No supporters yet, no comments, just the version number and a description you've rewritten four times. It's out there. That's the most you can say for it so far.
<</if>>
<br><br>
<<link "Close the page." "Computer">><</link>><h1>Relations</h1>
/* WIFE — always unlocked while the game is running */
<div class="rel-entry">
<div class="rel-portrait wife"></div>
<div class="rel-name">$wife.name</div>
<div class="rel-role">Your wife</div>
<div class="rel-body">
<<if $wife.mood >= 3>>
<p>Today she's bright and affectionate, leaning toward you whenever you cross paths.</p>
<<elseif $wife.mood == 2>>
<p>She's in a warm mood today, easy with you in a way she usually isn't.</p>
<<elseif $wife.mood == 1>>
<p>She seems content today, settled and unbothered.</p>
<<elseif $wife.mood == 0>>
<p>She's neither warm nor cold today, just going about her day.</p>
<<elseif $wife.mood == -1>>
<p>She's irritable today, her answers short and her patience thin.</p>
<<elseif $wife.mood == -2>>
<p>She's visibly upset, keeping her distance.</p>
<<else>>
<p>She's furious, her jaw set whenever she sees you.</p>
<</if>>
<<if $wife.relationship >= 80>>
<p>Underneath the day-to-day, the two of you are close to what you were at the start. She trusts you, and she wants you to win.</p>
<<elseif $wife.relationship >= 50>>
<p>Underneath the day-to-day, a real partnership is rebuilding. The resentment isn't gone, but it isn't the loudest thing in the room anymore.</p>
<<elseif $wife.relationship >= 25>>
<p>Underneath the day-to-day, there's a slow thaw between you. She gives you the benefit of the doubt more often than not now.</p>
<<elseif $wife.relationship >= 0>>
<p>Underneath the day-to-day, the two of you hold a quiet truce, living alongside each other without much warmth but without open conflict.</p>
<<elseif $wife.relationship >= -10>>
<p>Underneath the day-to-day, things are strained. She doesn't trust you and doesn't bother hiding it.</p>
<<else>>
<p>Underneath the day-to-day, it's effectively over. She's here because she has nowhere else to go.</p>
<</if>>
<<if $wife.suspicionLocked>>
<p>And she knows. The worst of what you did behind her back is out now, no longer a secret to keep but a thing to live down. Stay clean and it stays in the past.</p>
<<elseif $wife.suspicion >= 10>>
<p>And you've stepped out on her enough times now that you've half stopped believing you'll get away with it. It's no longer a question of whether it surfaces, more a question of when.</p>
<<elseif $wife.suspicion >= 5>>
<p>And you've been unfaithful more than once, and left more than one loose thread behind you. Secrets like these have a way of working their way to the surface.</p>
<<elseif $wife.suspicion >= 1>>
<p>And there's the matter of what you did behind her back. Small enough to tell yourself it meant nothing, but not the kind of thing that stays buried on its own.</p>
<</if>>
</div>
</div>
/* ASSISTANT — appears once first seen with the grad cohort (L4).
Pre-unlock she reads as a mentee; post-unlock the frame shifts. */
<<if $assistant.met>>
<div class="rel-entry">
<div class="rel-portrait assistant"></div>
<div class="rel-name">$assistant.name</div>
<<if not $assistant.unlocked>>
<div class="rel-role">Graduate programme</div>
<<elseif $assistant.affair>>
<div class="rel-role">Your assistant</div>
<<else>>
<div class="rel-role">Your junior</div>
<</if>>
<div class="rel-body">
<<if not $assistant.unlocked>>
<p>Her name is on the graduate rotation list and she keeps landing back at your desk, which stopped being the rota's doing some weeks ago. You give her the work that gets noticed. She turns it around faster than it deserves and has never once asked why you picked her.</p>
<<else>>
/* Where it stands */
<<if $assistant.tier == 0>>
<p>Kept on after the programme and assigned to you. Your junior, your call, your name on her reviews. She is careful, quick, and reads a room before she is all the way inside it. Nothing has been said out loud. Neither of you has needed it said.</p>
<<elseif $assistant.tier == 1>>
<p>The conversations at her desk run well past the point where they are about the work, and neither of you is ever the one to end them. You have started noticing which days she is in the office before you decide what to wear to it.</p>
<<elseif $assistant.tier == 2>>
<p>You are sleeping with her. The two of you agreed without ever agreeing that it does not exist inside the building, so on that floor she calls you by your title and hands you documents at arm's length. Off it, she answers within the minute.</p>
<<else>>
<p>It has a shape now, and she is the one who keeps it. She runs your calendar and your travel and the gaps in both that the two of you use. She stopped asking when she would see you next some time ago, because she is the one who books it.</p>
<</if>>
/* What has actually happened */
<<if $assistant.hookupCount >= 10>>
<p>The hotel room on the client trip was the line, and it stopped being the point some weeks ago. It happens in the building now, in whatever room is empty at ten past five, often enough that you have both stopped counting and started having preferences. She is the one who knows which doors lock.</p>
<<elseif $assistant.hookupCount >= 1>>
<p>The hotel room on the client trip was the line. Since then it has found its way inside the building, in the half hour after the floor thins out, in rooms that were not built for it. Neither of you has ever suggested it in words that would mean anything if they were repeated.</p>
<<elseif $assistant.tripTaken>>
<p>The hotel room on the client trip is the line, and you both knew it was coming before the plane left the ground. On the flight home she said nothing changes on that floor, and then asked you to put her name down for the next trip.</p>
<<elseif $assistant.flirtStage >= 3>>
<p>Nothing has happened. Not your jacket around her shoulders at the curb, not her hand closing on your arm when the floor lights cut out, not the half hour in the third-floor gym where you could have reached for her and you both knew it. Nothing has happened, three times now.</p>
<<elseif $assistant.flirtStage == 2>>
<p>Two things you would not repeat to $wife.name: your jacket around her shoulders at the curb after drinks, and her hand finding your arm in the dark when the building decided the floor was empty.</p>
<<elseif $assistant.flirtStage == 1>>
<p>One night after drinks you put your jacket round her shoulders while you both waited for cars, and she kissed you on the cheek before hers came. Neither of you has mentioned it since. You have both thought about it since.</p>
<</if>>
/* Office attention. Same bands as the hub tell, but standing state
rather than an incident. Nothing below 3. */
<<if $assistant.affair and $assistant.heat >= 9>>
<p>And the floor has stopped pretending not to notice. Nobody has said it to your face and nobody is going to, right up until the moment somebody does. Whatever you two do next, the building is watching for it.</p>
<<elseif $assistant.affair and $assistant.heat >= 6>>
<p>And people have started to put things together. Not all of it, and not out loud, but the two of you have left enough small oddities lying around the floor that somebody is going to pick them up and turn them over.</p>
<<elseif $assistant.affair and $assistant.heat >= 3>>
<p>And there's the beginning of something in the way the floor looks at the pair of you. Nothing anybody could act on. Just a little more attention than there was a month ago.</p>
<</if>>
<<if $assistant.affair and $gameDay < $assistant.coolOffUntil>>
<p>For the moment she has drawn a line under all of it, and she will tell you when that has changed.</p>
<</if>>
<</if>>
</div>
</div>
<</if>>
/* FUTURE: au pair, etc. Same pattern — its own rel-entry, gated on an unlock
flag, with a matching .rel-portrait.<name> rule in the stylesheet. */
<div class="rel-foot"><<link 'Return' $return>><</link>></div><h2>Night</h2>
<<dayshift>>
/* Build event pool */
<<set _events = ["restful", "quick", "uneventful", "street_shout", "car_alarm", "radiator", "cold_room"]>>
/* Wife mood / relationship */
<<if $wife.mood <= -1 or $wife.relationship < 0>>
<<run _events.push("cold_bed", "wife_awake")>>
<</if>>
<<if $wife.mood >= 1 and $wife.relationship >= 25>>
<<run _events.push("wife_close", "watching_her")>>
<</if>>
/* Arousal: the higher the arousal, the worse the odds of a decent night */
<<if $arousal >= 7>>
<<run _events.push("hot_dream", "restless", "wound_up")>>
<<if $arousal >= 9>>
<<run _events.push("hot_dream", "restless", "wound_up")>>
<</if>>
<</if>>
/* Went to bed exhausted */
<<if $energy <= 1>>
<<run _events.push("dead_to_world")>>
<</if>>
/* Random nuisance events */
<<if random(1, 8) == 1>>
<<run _events.push("snoring")>>
<</if>>
<<if random(1, 6) == 1>>
<<run _events.push("kid_crying")>>
<</if>>
<<if random(1, 7) == 1>>
<<run _events.push("neighbors")>>
<</if>>
/* Pick one */
<<set _chosen = _events.random()>>
/* A good bed buys back the comfort-based bad nights (not the arousal ones,
which are meant to sting). One re-roll toward a restful outcome. */
<<if $items.goodBed and ["car_alarm", "street_shout", "radiator", "cold_room"].includes(_chosen)>>
<<if random(1, 100) <= 70>>
<<set _chosen = ["restful", "quick", "uneventful"].random()>>
<</if>>
<</if>>
<<switch _chosen>>
<<case "restful">>
You sleep deeply, and the night passes in what feels like minutes. You wake to soft morning light, the weight of the day not yet on you.
<<case "quick">>
You drift off quickly and wake when the first gray light pushes through the curtains. Nothing in between.
<<case "uneventful">>
Sleep comes easily and leaves the same way. The night passes without anything worth remembering.
<<case "street_shout">>
Sometime past midnight you wake to someone shouting in the street below. By the time you've worked out it's nothing to do with you, they've moved on. The street goes quiet again, and after a while so do you.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "car_alarm">>
A car alarm goes off somewhere on the block. It cuts out, starts again, cuts out, and finally stays quiet. You aren't sure when you fell back asleep.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "radiator">>
The radiator clanks at some godforsaken hour. You lie there listening to it until it settles, and you don't quite get the night back after that.
<<case "cold_room">>
You wake some time before dawn, cold, the blanket bunched somewhere on the floor. You drag it back over yourself and try to find the warm spot again. It takes a while.
<<case "cold_bed">>
$wife.name sleeps with her back to you, the duvet bunched between you like a wall. You match her posture and pretend it doesn't matter.
<<case "wife_awake">>
You wake briefly in the small hours. $wife.name is awake too, eyes open in the dark, not looking at you. Neither of you says anything. Eventually you both pretend to be asleep again.
<<case "wife_close">>
Sometime in the night $wife.name shifts against you in her sleep, her cheek finding your shoulder. You stay very still so as not to wake her.
<<case "watching_her">>
You wake before her and lie there for a while, listening to her breathing. It feels like an unearned gift.
<<case "hot_dream">>
You dream of something hot and half-remembered. You wake with your heart still going, a hard on and the dream already slipping. By the time you sit up, only the heat is left. Your mind is racing with lust, and you have a hard time getting back to sleep.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "restless">>
Sleep doesn't come easy with a hard on. You lie there for what feels like hours, mind wandering somewhere it shouldn't, until exhaustion finally pulls you under.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "wound_up">>
You lie there wide awake, wound too tight to settle. Your thoughts keep circling back to the hottie from the office. It's too late to jerk off now, so you settle in and try to keep your head clean. Sleep, when it finally comes, is thin and grudging. You surface before the alarm, already tired.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "dead_to_world">>
You hit the pillow and that's the last thing you remember. You wake feeling like you barely moved all night.
<<case "snoring">>
$wife.name elbows you awake at some point in the night, mumbling that you're snoring. You grunt an apology and roll over. By morning she still seems kinda pissed about it.
<<moodShift -1>>
<<case "kid_crying">>
At some point in the small hours, your kid starts crying from down the hall. $wife.name is up before you've even processed it. You hear her low voice through the wall, soothing, patient. By the time she comes back to bed, you're already pretending to be asleep.
<<if $wife.mood <= 0>>
<<moodShift -1>>
<</if>>
<<case "neighbors">>
You're nearly under when it starts up through the ceiling. The couple upstairs, the headboard finding its rhythm, and then her voice, low at first and climbing. You lie still in the dark and listen to a stranger's wife work her way toward climaxing, the sound carrying clean through the thin plaster as though the wall were never there. $wife.name doesn't stir beside you. By the time it finishes overhead you're wide awake, and wishing it was you making a woman sound like that.
<br><br>
<span class="arousal">Arousal increased.</span>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<</switch>>
<br><br>
<<link "Get up." $morningScene>><</link>><h2>Taking the Edge Off</h2>
<<set _gifs = []>>
<<for _i = 1; _i <= 15; _i++>>
<<set _gifs.push("p" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/self/' + _gifs.random()" width="100%">
</div>
<br>
You need some quick relief, so you take out your phone, and find a good video. Before long, you've defiled a tissue.
<<set $arousal = Math.max($arousal - 3, 0)>>
<<sexEnergy 1>>
<<set $ventedToday = true>>
/* Costs a time phase during the day, so venting competes with everything else
you could be doing. Free at Night so it's never too late to take the edge off
before bed, though it carries the risk of $wife seeing you */
<<if $time < $timeMax>>
<<set $time = Math.min($time + 1, $timeMax)>>
<</if>>
/* Catch roll: only if she's home but elsewhere in the house. If she's "out",
no risk at all. */
<<set _caught = false>>
<<if ["bedroom","kitchen","livingroom","bathroom"].includes($wife.location)>>
<<if random(1, 100) <= 50>>
<<set _caught = true>>
<</if>>
<</if>>
<<if _caught>>
<br><br>
Just as you ejaculate, you hear the door and suddenly $wife.name is there and catches you in the act.
<<if $wife.relationship < 0>>
<<speech "Wife" $wife.name>>
What the hell are you doing? I live here too, you know.
<</speech>>
<<moodShift -2 -2>>
<<else>>
<<speech "Wife" $wife.name>>
Seriously? Could you not? God.
<</speech>>
<<moodShift -1 -1>>
<</if>>
<</if>>
<br><br>
<<link "Continue." $return>><</link>><img src = "images/logo/earnit_logo_lastcall_transparent_tight.png" width = "100%"><<if $gameRunning>>
<div class="datetime"><<datetime>></div>
<<if $weekday <= 5 and $time == 1 and !$job.attendedToday>>
<span class="warning">You should be at work.</span><br>
<<elseif $weekday <= 5 and $job.missedToday>>
<span class="bad">You skipped work today.</span><br>
<</if>>
<<if $weekday == 6>>
<span class="warning">Rent is due tomorrow: $<<print $rent>>.</span><br>
<</if>>
<<paydayFeedback>>
<<rentFeedback>>
<<maidFeedback>>
<<projectPayoutFeedback>>
<<fitnessFeedback>>
<<meter $energy $energyMax "Energy">>
<<meter $arousal $arousalMax "Arousal" "#B23A6B">>
<<print 'Money: $' + $money>><br>
<<if $debugMode == true>>
<br><br>
<<link [[Control Panel|Control Panel]]>>
<</link>>
<br>
$wife.name Relationship: $wife.relationship
<br>
$wife.name Mood: $wife.mood
<br>
$wife.name Suspicion: $wife.suspicion
<br>
$wife.name Worry: $wife.worry
<br><br>
<</if>>
<div class="sidebar-nav">
<span @class="($phone.wifeUnread or $phone.friendUnread or $phone.galleryNew > 0) ? 'nav-item nav-alert' : 'nav-item'"><<link "📱 Phone" "Phone">><</link>></span>
<<link $name "Character">><</link>>
<<link "Relations" "Relations">><</link>>
</div>
<<else>>
<</if>><<set $gameTitle = "Earn It">>
<<set $gameRunning = false>>
<<set $debugMode = false>>
<<include 'PC Setup'>>
/* Time Variables */
<<set $time = 0>>
<<set $timeMax = 8>>
<<set $weekday = 1>> /* 1 = Monday */
<<set $gameDay = 1>>
<<set $intimacyUnlockDay = 8>> /* no intimacy with wife before week 2 */
/* Chores */
<<set $chores = {
bedroom: false,
kitchen: false,
livingroom: false,
}>>
/* Wife Variables */
<<set $wife = {
name: "Ashley",
relationship: 0,
mood: 0,
location: "kitchen",
bailedOut: false,
choreToday: false,
choreCounter: 0,
choreThanks: false,
choreNeglect: 0,
choreScold: false,
careToday: false,
careCounter: 0,
careThanks: false,
careNeglect: 0,
careScold: false,
talkedToday: false,
cookedToday: false,
talkTopic: "",
intimacyToday: false,
obligation: false,
dutyCount: 0,
dutyScold: false,
lastInteraction: "",
spiedToday: false,
bathroomViewedToday: false,
arousalNoticedToday: false,
suspicion: 0,
suspicionLocked: false,
cheatedToday: false,
discoveryToday: false,
discoveryResult: 0,
ultimatumShown: false,
ultimatumToday: false,
worry: 0,
recklessToday: false,
worryScoldToday: false,
worryResult: 0,
tipsy: false,
wineToday: false,
lastWineDay: -3,
dateToday: false,
lastDateDay: -3,
dateType: "",
dateQuality: "",
doingYoga: false,
yogaViewedToday: false,
wardrobeMalfunction: false,
wardrobeRollDay: 0,
wardrobeSeen: false,
tidyRollDay: 0,
tidyToday: false,
lastIntimacyDay: -99,
cycleStart: random(0, 27),
cycleOff: false,
outingResolved: false,
outForDay: false,
lazyMorningToday: false,
affectionToday: false,
lingerieSelfieDay: 0,
lingerieNightDay: 0
}>>
/* Assistant Variables */
<<set $assistant = {
name: "Nadia",
met: false, /* first sight with the L4 grad cohort */
unlocked: false, /* assigned to him at L5; romance mechanics go live */
influence: 0, /* 0-100, the single axis; ratchet, no decay */
tier: 0, /* derived from influence + affair gate */
tierUp: false,
seedStage: 0, /* how many L4 tutoring scenes have fired (0-4) */
lastSeedDay: 0, /* $gameDay the last seed scene fired; spacing gate */
flirtStage: 0, /* how many L5 flirt milestones have fired (0-3) */
lastFlirtDay: 0, /* $gameDay the last flirt fired; spacing gate */
spokeToday: false, /* hub check-in daily one-shot */
probedToday: false, /* boundary-push daily one-shot */
lastProbe: "", /* id of last probe scene shown; avoids repeats (not reset daily) */
lastAction: "", /* drives assistantReact; cleared after it prints */
affair: false, /* trip crossed; lifts the tier-1 cap in assistantCheck */
tripTaken: false, /* the company-trip gate has been completed */
tripPending: false, /* accepted the offer; departure fires next morning via dayResolveMorning */
lastTripOfferDay: -99, /* $gameDay the offer last showed; re-offer cooldown after a decline */
/* Office hookup loop */
hookupToday: false, /* daily one-shot; reset in resetAssistantFlags */
lastHookupDay: -99, /* reference for later content */
hookupCount: 0, /* running total; feeds later content */
heat: 0, /* 0-10, office attention; decays 1 per day without */
lastHookupLoc: "", /* avoids the same location twice running */
lastHookupAct: "", /* weights her choice away from a repeat */
heatTellDay: 0, /* one heat tell per day, not one per hub visit */
coolOffPending: 0, /* days she will ask for; 0 = nothing owed */
coolOffUntil: 0, /* $gameDay the loop reopens */
/* Gym encounter */
lastGymDay: -99, /* $gameDay the encounter last fired; 3 day cooldown */
hookupSource: "" /* "office" | "gym" | "gymAM"; drives pool, intro and tail */
}>>
/* Friend Variables) */
<<set $friend = {
name: "Col",
relationship: 0,
drankToday: false,
topic: "",
lastTopic: ""
}>>
/* Work System */
<<set $job = {
title: "Junior Software Engineer",
wage: 100,
level: 1,
daysWorked: 0,
daysMissed: 0,
performance: 0,
attendedToday: false,
missedToday: false,
wfhToday : false,
breakRoomRollDay: 0,
breakRoomToday: false,
promotionPending: false,
paidThisWeek: null,
lastAttendance: 0,
eventToday: false,
lastEventDay: -99,
eventCooldown: 3,
distractedToday: false,
lastWorkScene: "",
eventOutcome: "",
sceneGif: "",
sceneText: "",
drainType: "",
lastDrainDay: -99,
drainCooldown: 5,
stayedLate: false,
lastCalloutDay: -99,
calloutCooldown: 10,
calloutPending: false
}>>
/* Rent System */
<<set $rent = 400>>
<<set $rentResult = null>>
/* Other variables */
<<set $gameOverCause = null>>
<<set $onsEver = false>>
<<set $swEver = false>>
<<set $sceneLoc = "">> /* Intimacy scene location snapshot */
<<set $morningScene = "Bedroom">>
<<set $deferredMorning = "">> /* a morning scene the trip preempted; replays after he's home */
/* Computer variables */
<<set $pcMsg = "">>
<<set $project = {
started: false,
dev: 0, /* progress toward the next release */
devNeeded: 3, /* sessions needed for the next release; grows each version */
version: 0, /* releases shipped */
supporters: 0, /* drives weekly income */
weeklyIncome: 0, /* paid out each Monday */
lastPayout: 0,
pendingChoice: "",
choices: {
genre: "",
protagonist: "",
feature: ""
},
supMult: 3
}>>
/* One Night Stand Ex Variables */
<<set $ex = {
live: false,
saved: false,
pending: false,
day: 0,
scares: 0,
lastNudeImg: ""
}>>
/* Phone Variables */
<<set $phone = {
unlocked: true, /* set false for a later tutorial unlock */
gallery: [], /* array of {img, caption, day} */
galleryNew: 0,
wifeUnread: false,
wifePendingImg: "",
wifeTextedToday: false,
wifeMsgText: "",
nudeAskedToday: false,
lastNudeDay: -3,
nudeCooldown: 7,
lastNudeImg: "",
intimacyPicToday: false,
friendTextedToday: false,
friendUnread: false,
lastFriendPing: 0,
friendCooldown: 4,
friendPingTopic: "",
msgTopic: "",
viewImg: "",
viewNote: "",
wifeMsgType: ""
}>>
/* Cleaning service (maid) */
<<set $maid = {
active: false,
cost: 75,
lastBilled: 0,
billedThisWeek: 0,
lapsed: false
}>><<link `"Version " + setup.gameVersion` "Version">><</link>>
<br>
<<link "Patreon">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>><h2>Living Room</h2>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _theme = ["oldies", "news", "sport"].random()>>
<<switch _theme>>
<<case "oldies">>
<<set _tvGif = "images/h/tv/vintage" + random(1, 8) + ".gif">>
<<set _lines = [
"You flick past the oldies channel and stop. One of those films from decades back, the picture soft and grainy, and a scene playing out that no one involved seems to have thought twice about. Back then the artistic freedom meant big old titties on display as much as possible. Absolute cinema.",
"The oldies channel is running one of the classics, the kind they made before everyone got nervous about showing a good old pair of jugs. A scene unfolds with an easy, unbothered frankness you don't see much anymore, the actors carrying on like it's the most natural thing in the world. You linger on it a while before moving on.",
"You land on the oldies channel mid-scene. Grain, warm color, a certain looseness to how these old films handled things, as if nobody had told them to be coy about it. Less about story and more about getting people going. It catches you off guard, and you sit with it longer than you'd admit before thumbing to the next channel.",
"An old film is playing on the retro channel, from back when this sort of thing turned up in a Tuesday-night picture without ceremony. Not to give some great cinematic experience. More for the purpose of watching some knockers or melons or whatever they called it back then. You watch it play out before you carry on flicking."
]>>
<<case "news">>
<<set _tvGif = "images/h/tv/show" + random(1, 5) + ".gif">>
<<set _lines = [
"The news is on, or something dressed up as news, an anchor at a curved desk reading autocue in a top a size too deliberate. Every cutaway to the weather graphic is really a cutaway to the woman standing in front of it. You watch a full forecast for a region you'll never visit.",
"Some panel show, minor celebrities you half recognize, and a presenter who spends the whole segment crossing and recrossing her legs in a way the director keeps finding excuses to frame. You couldn't tell anyone what they were discussing. You weren't listening.",
"A daytime magazine programme, the couch kind, and the co-host has one of those laughs that makes the guest lean in and the audience whoop. She's dressed for a warmer studio than the one she's in, and the show knows it, and so, after a minute, do you."
]>>
<<case "sport">>
<<set _tvGif = "images/h/tv/sport" + random(1, 5) + ".gif">>
<<set _lines = [
"You land on the sports channel, and it isn't the game that holds you. The camera is very keen on who it follows, and whoever's directing has strong opinions about where the lens belongs. Keeps viewers hooked, you guess. You stay on it far longer than a man with no team in the match has any business doing.",
"Some match you have no stake in, and you couldn't say who's ahead. What keeps you on the channel is everything happening at the edges of the play, the camera drifting off the action every chance it gets. You follow it with a focus you can't manage for anything that actually matters.",
"You tell yourself you're only waiting for something better to come on. But the camera keeps lingering where it shouldn't, and you don't change the channel, and the game plays on without you following a second of it."
]>>
<</switch>>
<div class="intro-image">
<img @src="_tvGif" width="100%">
</div>
<<= _lines.random()>>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Keep flicking." $return>><</link>><h2>The Anchor</h2>
A windowless box of a bar at the dead end of the plaza, lit the color of weak tea. A jukebox nobody's updated since the nineties, a couple of beers on tap, and a handful of regulars who treat the place like a second living room. The bartender, a heavyset woman called Marie, polishes a glass that was clean an hour ago.
<<switch $time>>
<<case 2>>Midday, and the Anchor is all but empty, a regular or two nursing the first of the day beneath the muted TV.
<<case 3>>The afternoon is slow and quiet, dust turning in the light from the propped-open door while Marie restocks the cooler.
<<case 4>>Late afternoon, and the first drinkers of the day drift in, shrugging off work or the lack of it.
<<case 5>>Early evening, and the after-work drinkers are trickling in, loosening ties they'll regret in the morning.
<<case 6>>The evening crowd has settled, the talk low and steady under the jukebox.
<<case 7>>Late, and the place has thinned to the committed, the ones with nowhere they'd rather be.
<<default>>Past closing for most places, but the Anchor keeps its own hours. A few stragglers nurse the last of the night.
<</switch>>
<br><br>
/* Drink */
<<if $time >= $timeMax>>
//It's late enough. One more and you won't make it home.//
<<elseif $money >= 8>>
A pint runs $8.
<br>
<<link "Buy a drink and settle in. ($8)" $return>>
<<set $money -= 8>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $drunk += 1>>
<</link>>
<<else>>
//A pint's $8, and you're short even for that.//
<</if>>
<<if $drunk == 1>>
<br>
//One in, and the day's edges have started to soften.//
<<elseif $drunk == 2>>
<br>
//Two deep. Warm, loose, the bar a friendlier place than it was.//
<<elseif $drunk >= 3>>
<br>
//You've had a few. The room has the gentle tilt of a night getting away from you.//
<</if>>
/* Friend, on Friday and Saturday evenings */
<<if ($weekday == 5 or $weekday == 6) and $time >= 5>>
<br><br>
<<if $friend.drankToday>>
//$friend.name is still propping up the far end of the bar, but you've had your session with him tonight.//
<<elseif $time >= $timeMax>>
$friend.name is here, but he's pulling his coat on. Too late to settle in with him now.
<<elseif $money < 16>>
$friend.name waves you over from his usual stool, but a proper session with him is a couple of rounds you can't cover tonight.
<<else>>
$friend.name is at the far end of the bar, same stool as ever, and lifts his glass when he spots you.
<br>
<<link "Have a few with $friend.name. ($16)" "Anchor Friend">>
<<friendDrinkSetup>>
<</link>>
<</if>>
<</if>>
/* Pickup: a stranger to take home. Needs a few drinks for the nerve, and
the night's one shot at it. */
<<if $time < $timeMax and $drunk >= 2 and not $onsToday>>
<br><br>
The bar is the kind of busy where a stranger could become the rest of your night, if you had the nerve to start it.
<br>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to be hitting on women tonight.//
<<else>>
<<link "Try your luck with someone." "Anchor Pickup">><</link>>
<</if>>
<</if>>
<br><br>
<<link [[Step back out to the plaza.|Eastgate Plaza]]>><</link>><h3>Version 0.2.3</h3>
//Earn It// now opens on a proper title screen, and the game keeps a running autosave.
<br><br>
- Added a start screen with New Game, Load Game and changelog.
<br>
- The game now autosaves once each morning, at the start of a new day.
<br>
- Saves are now labelled by day and time instead of turn number, so you can tell them apart at a glance.
<br>
- Saving is disabled during the prologue.
<br><br>
<h3>Version 0.2.2</h3>
Once you've climbed far enough, Helion's own gym opens up, just downstairs from your desk. $assistant.name uses it too, and she is not always there just to train.
<br><br>
- The Helion gym is now open to you once you've climbed far enough.
<br>
- Some sessions at the Helion Gym you'll catch a glimpse of some of your colleagues working out, giving you a slight arousal bump.
<br>
- Sauna has been added as a place to hook up with $assistant.name.
<br>
- Training at Helion costs you less energy than the boxing club, and the club has raised its game to compete.
<br>
- You can now reach the office before work, so a session competes with $wife.name's breakfast at home.
<br><br>
<h3>Version 0.2.1 - Obligation</h3>
The marriage no longer makes you wait weeks for a door to open.
<br><br>
From the second week, $wife.name will go along with you long before she wants to. She agrees because refusing is a conversation, and she is not remotely subtle about the difference. It costs you the warmth you were building, so leaning on it is a choice with a price, and eventually she says so out loud.
<br><br>
- A cold enough day no longer means a flat refusal. It means a smaller version of what you were after.
<br>
- New scenes written for the reluctant register, where she is present for the act and absent from it.
<br>
- Rebalanced how far into the marriage each act sits, so the long middle stretch has somewhere to go.
<br>
- Fewer days between, especially early on, and she turns you down far less often during her cycle.
<br>
- She notices when duty is all you're asking of her, and she will say so.
<br><br>
<h3>Version 0.2.0 - Meet your new assistant</h3>
Until now $wife.name has been the whole of your private life. This version adds a second person to it.
<br><br>
$assistant.name arrives at Helion as a graduate you're told to mentor, and if you keep climbing she ends up working for you: hired on permanently, two rows down, in your eyeline all day. She's good at the job and easy to be around, and she is never the one who pushes. She just doesn't stop you, and every small thing you get away with makes the next one easier.
<br><br>
Somewhere in there is a choice that can't be walked back. Refusing it is an option, but for now, it will come round again. Seize the opportunity and the affair moves into the workday itself, with its own routine and its own risks and costs. The floor notices long before anyone says anything to your face.
<br><br>
None of it is sealed off from home. Every evening at the office is an evening you weren't there, and $wife.name counts them the same way she counts everything else.
<br><br>
Alongside all that, fixes and balance work throughout.
<br><br>
<h3>Version 0.1.6</h3>
- Finalized the erotica rewrite.
<br>
- You can now approach $wife.name in the bathroom, opening up bathroom scenes that were previously out of reach.
<br>
- Reworked the side project's income and pacing so it grows more rewardingly over time.
<br>
- Added choices when building your own game (genre, protagonist, signature feature), with supporters reacting to the direction you take it.
<br>
- Code cleanup behind the scenes to keep future updates running smoothly.
<br><br>
<h3>Version 0.1.5</h3>
- Getting in shape means more now. The first couple of fitness levels still add stamina, but past that the rewards change: once you're properly athletic, sex and taking the edge off on your own stop costing you anything, so a fit man is never too worn out for either.
<br>
- New event: a good lingerie date now leads somewhere. If things stay warm between you, $wife.name has plans for that new set in the bedroom a few nights later.
<br>
- Evened out the cost of intimacy across the board. Being on the receiving end no longer tires you at all, whoever it's with, while going all the way costs a little energy until you're fit enough for it not to.
<br>
- A better bed is now available at the pawnbroker. Sleep on a proper mattress and the little disruptions of the night bother you less often.
<br>
- Continued revisions of erotica texts.
<br>
- Various bug fixes.
<br><br>
<h3>Version 0.1.4</h3>
- Nights aren't always restful now. A bad night's sleep can leave you starting the next day with less energy than usual.
<br>
- Reworked how the game decides which scene greets you in the morning, so confrontations with $wife.name resolve cleanly and never step on each other.
<br>
- A tense morning conversation with $wife.name now takes place in the bedroom, where it belongs.
<br>
- Some workdays hit harder than others now. Occasionally a shift will grind you down for an extra point of energy, and now and then you'll be asked to stay late, trading time and energy for standing at Helion, or ducking out and taking the hit to your performance.
<br>
- Keeping the flat in order and keeping $wife.name close are now two separate things. Let the house go and she'll say something about the mess; let her go and she'll say something about you. The cleaning service handles the first. Nothing handles the second but you.
<br>
- Helion may occasionally call you in on a Saturday. Answer it for money and career, or turn it down for the family outing. Either way something gives.
<br>
- New artwork for one of $wife.name's harder mornings.
<br>
- Revisions of the erotica texts. This will be an ongoing thing until I have been through all earlier scenes.
<br>
- Various fixes under the hood.
<br><br>
<h3>Version 0.1.3 - Intimacy with $wife.name</h3>
This one's for everyone on f95zone who asked for more with $wife.name. You were loud about it, and you were right.
<br><br>
- You can now hold $wife.name close in the interact menu, a quiet moment of affection that lifts her mood and slowly builds your relationship. Catch her in the right frame of mind, though. If she's irritable, she'll wave you off.
<br>
- $wife.name is more her own person in bed now. Her mood colors how present she is and how much pleasure she is getting, so a good day can warm her up even early on, and there's more variety in how each moment plays out instead of the same lines every time.
<br>
- A new date: take $wife.name lingerie shopping once things are warming up between you. Help her pick a set, and a few days later she might send a little something to remind you it was worth the trip.
<br>
- Content added to existing sex scenes in office and for the one night stand.
<br>
- Reworked the sidebar: Phone, Character, and Relations are now gold buttons grouped together, separated from the version and Patreon links.
<br>
- Bug fixes and general rebalancing, including a special focus on rebalancing energy, making for a bit more of a challenge and more incentive to work out.
<br><br>
<h3>Version 0.1.2 </h3>
- Reworked the Relations menu into a cleaner, more readable format, with room for new faces to join the cast as the story grows.
<br>
- $wife.name will now go all the way with you in the kitchen, not just the bedroom, bathroom, and living room. Catch her there in the right mood.
<br>
- A cleaning service is now available under Services in your phone. Pay weekly and your home keeps itself tidy, so the chores stop being your job and $wife.name stops resenting the mess.
<br>
- New and improved images of $wife.name relaxing in the living room.
<br>
- Bug fixes and balancing, including a cap on how far chores alone can carry your relationship with $wife.name (around 50%).
<br><br>
<h3>Version 0.1.1 - Phone</h3>
- Added a phone in the sidebar. Text $wife.name, and as things warm up with her, ask her for pictures that save to a gallery you can come back to, or perhaps she will let you snap a photo of her in action.
<br>
- Also the option to text $friend.name. He may also reach out and invite you to the bar.
<br>
- A one-night stand can now come back to haunt you. Hungry for more, she may resurface by text, and keeping that hidden from $wife.name is its own quiet risk.
<br>
- Bug fixes and balancing.
<br><br>
<h3>Version 0.1.0 - First release</h3>
Welcome to //Earn It//.
You're $name: thirty pounds heavier than you used to be, a failed company behind you, and a marriage held together mostly by a wife with nowhere better to go. There's a son who barely knows you, rent you can't always cover, and a job writing code for people whose names you're not allowed to know. Nobody's handing you the way back. Whatever you want from here, her trust, the money, your own reflection in the mirror, you earn it.
<br><br>
This first release covers the core of the game: the daily grind of work, chores, and training, a marriage you can rebuild or wreck, the climb up the ladder at Helion Dynamics, and a handful of ways to spend, or waste, your evenings around town. It's the foundation, and it's playable start to finish, but it's a foundation. Plenty of doors in this version are locked for now. They'll open as the game grows.
<br><br>
Thank you for playing this early. Bug reports and feedback will shape what comes next.
<br><br>
//Albasaur//
<br><br>
<<link "Close version description." `$return || "Start Menu"`>><</link>>Your phone buzzes on the kitchen counter. Helion's name on the screen on a Saturday morning is never good.
<br><br>
<div class="chat">
<div class="bubble in">Production's down and the client's climbing the walls. Need you on-site. How soon can you be here?</div>
</div>
You look up. $wife.name is already in the doorway, the boy's little backpack over one shoulder, and she reads the whole thing off your face before you've said a word. Her arms fold slowly.
<br><br>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_callout1.jpeg', 'images/characters/w/w_callout2.jpeg')" width="100%">
</div>
<<speech "Wife" $wife.name>>
I thought we were going out.
<</speech>>
<br>
She doesn't say it sharply. That's almost worse. She just waits, the bag still on her shoulder, watching you decide what kind of Saturday this is going to be.
<br><br>
''What do you do?''
<br>
<<link "Take the callout. The money's good and someone will notice." "Helion Callout">>
<<set $job.calloutPending = false>>
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<</link>>
<br>
<<link "Stay. You promised, and you're keeping it." "Weekend Outing">>
<<set $job.calloutPending = false>>
<<set $job.performance -= 1>>
<<moodShift 1>>
<</link>><h2>Out with the Family</h2>
<<set $wife.outingResolved = true>>
<div class="intro-image wide">
<img src="images/dates/outing_parkbench.jpeg" width="100%">
</div>
<br>
<<set $time = 5>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 5)>>
<<if _score >= 80>>
<<set _q = "great">>
<<elseif _score >= 40>>
<<set _q = "good">>
<<else>>
<<set _q = "flat">>
<</if>>
<<switch _q>>
<<case "flat">>
<<set $wife.relationship += 1>>
The afternoon is fine. You push the swing, you carry the bag, you say the right things at the right times, and some part of you stays a half-step outside it all, watching yourself do it. $wife.name notices, the way she notices everything now. But you were there, and the boy laughed at least once, and that isn't nothing.
<<case "good">>
<<set $wife.relationship += 2>>
<<moodShift 1>>
It's an easy few hours. The park, an ice cream that ends up mostly on the boy, the slow walk back with him asleep against $wife.name's shoulder. The talk between you comes without effort for once, about nothing in particular, which is its own small luxury.
<<case "great">>
<<set $wife.relationship += 3>>
<<moodShift 1>>
Somewhere between the swings and the walk home it stops feeling like effort. The boy has you chasing him until you are both breathless, and when you look up $wife.name is watching the pair of you with something on her face you haven't earned in a long time. She takes your hand on the way back. Nobody says anything. Nobody needs to.
<</switch>>
<br><br>
<<link "Head home." "Living Room">><</link>><<set _outingImg = either('images/characters/w/w_casualOutingAsk1.jpeg', 'images/characters/w/w_casualOutingAsk2.jpeg')>>
<div class="intro-image wide">
<img @src="_outingImg" width="100%">
</div>
<br>
<<if $wife.mood >= 1>>
$wife.name has the boy's bag over one shoulder, gathering up the last of his things by the door.
<br><br>
<<speech "Wife" $wife.name>>
We're heading out for a bit. Come with us?
<</speech>>
<<else>>
$wife.name is getting the boy's things together, coat and bag by the door.
<br><br>
<<speech "Wife" $wife.name>>
I'm taking him out. You can come, if you want.
<</speech>>
<</if>>
<br>
<<link "Go with them for the afternoon." "Weekend Outing">>
<</link>>
<br>
<<link "Stay. You've got things to do." $return>>
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<</link>><<widget "dayshift">>
/* ---- 1. TIME ---- */
<<set $gameDay += 1>>
<<set $time = 0>>
<<set $weekday += 1>>
<<if $weekday > 7>><<set $weekday = 1>><</if>>
/* ---- 2. PASSIVE INCOME (project payout, Mondays) ---- */
<<if $weekday == 1 and $project.weeklyIncome > 0>>
<<set $money += $project.weeklyIncome>>
<<set $project.lastPayout = $project.weeklyIncome>>
<<else>>
<<set $project.lastPayout = 0>>
<</if>>
/* ---- 3. FITNESS DECAY ---- */
<<set _daysInactive = $gameDay - $lastWorkoutDay>>
<<if _daysInactive >= 5 and not $fitnessWarningShown>>
<<set $fitnessWarning = true>>
<<set $fitnessWarningShown = true>>
<<else>>
<<set $fitnessWarning = false>>
<</if>>
<<if _daysInactive >= 7>>
<<set $fitness -= 1>>
<<if $fitness < 0>><<set $fitness = 0>><</if>>
<</if>>
<<fitnesscheck>>
/* ---- 4. WIFE MOOD BASELINE ----
ORDER: must run BEFORE phase 5. moodReset sets the day's
baseline mood; the neglect scolds in phase 5 override it
downward. Reverse these and the scold's mood hit is wiped. */
<<if $wife.relationship > 100>><<set $wife.relationship = 100>><</if>>
<<moodReset>>
/* ---- 5. WIFE UPKEEP / CARE NEGLECT ---- */
<<if not $wife.choreToday>>
<<set $wife.choreNeglect += 1>>
<<else>>
<<set $wife.choreNeglect = 0>>
<</if>>
<<if $wife.choreNeglect >= 2>>
<<set $wife.relationship -= 1>>
<<set $wife.choreNeglect = 0>>
<<set $wife.choreScold = true>>
<<set $wife.choreThanks = false>>
<<if $wife.mood > -2>><<set $wife.mood = -2>><</if>>
<</if>>
<<if not $wife.careToday>>
<<set $wife.careNeglect += 1>>
<<else>>
<<set $wife.careNeglect = 0>>
<</if>>
<<if $wife.careNeglect >= 4>>
<<set $wife.relationship -= 2>>
<<set $wife.careNeglect = 0>>
<<set $wife.careScold = true>>
<<set $wife.careThanks = false>>
<<if $wife.mood > -2>><<set $wife.mood = -2>><</if>>
<</if>>
/* ---- 6. HOUSE STATE (chore reset, then maid) ----
ORDER: chore reset first, so the maid re-cleans for today;
next dayshift's neglect check then sees yesterday done. */
<<set $chores = {
bedroom: false,
kitchen: false,
livingroom: false
}>>
<<if $maid.active and ($gameDay - $maid.lastBilled) >= 7>>
<<if $money >= $maid.cost>>
<<set $money -= $maid.cost>>
<<set $maid.lastBilled = $gameDay>>
<<set $maid.billedThisWeek = $maid.cost>>
<<else>>
<<set $maid.active = false>>
<<set $maid.lapsed = true>>
<</if>>
<</if>>
<<if $maid.active>>
<<set $chores.bedroom = true>>
<<set $chores.kitchen = true>>
<<set $chores.livingroom = true>>
<<set $wife.choreToday = true>>
<<set $wife.choreNeglect = 0>>
<<set $wife.choreScold = false>>
<</if>>
/* ---- 7. WIFE DAILY FLAG RESET ---- */
<<resetWifeFlags>>
/* ---- 8. WEEKLY / CONFRONTATION CHECKS ----
ORDER: rent → suspicion → marriage → worry → ex.
marriageCheck and worryCheck both read discovery flags set
by suspicionCheck, so suspicion must precede them. */
<<if $weekday == 7>>
<<rentCheck>>
<</if>>
<<suspicionCheck>>
<<marriageCheck>>
<<worryCheck>>
<<exCheck>>
/* ---- 9. OFFICE COOL-OFF ARMING ----
ORDER: must run AFTER the phase 8 checks, which set discoveryToday and
ultimatumToday. Holds the length rather than a boolean, so the scene
doesn't need to know which event armed it. A second event while a
lockout is already running re-arms, and the scene restarts the clock
from the day he next reaches the office. */
<<if $assistant.affair>>
<<if $wife.discoveryToday>>
<<set $assistant.coolOffPending = Math.max($assistant.coolOffPending, 5)>>
<</if>>
<<if $wife.ultimatumToday>>
<<set $assistant.coolOffPending = Math.max($assistant.coolOffPending, 7)>>
<</if>>
<</if>>
/* ---- 10. MORNING ARBITER ----
ORDER: must run LAST of the wife checks. It reads the
discovery/ultimatum/worry-scold flags the phase 8 checks set
and decides which scene greets the player on waking. */
<<dayResolveMorning>>
/* ---- 11. PLAYER / SYSTEM DAILY RESET ---- */
<<resetDailyState>>
<</widget>>/* START: RENT CHECK */
<<widget "rentCheck">>
<<if $money >= $rent>>
<<set $money -= $rent>>
<<set $rentResult = "paid">>
<<elseif !$wife.bailedOut>>
<<set $wife.bailedOut = true>>
<<set $wife.relationship -= 5>>
<<set $wife.mood = -3>>
<<set $rentResult = "bailed">>
<<else>>
<<set $rentResult = "gameover">>
<<set $gameOverCause = "rent">>
<<set $gameRunning = false>>
<<goto "Game Over">>
<</if>>
<</widget>>
/* END: RENT CHECK */
/* START: RENT FEEDBACK */
<<widget "rentFeedback">>
<<if $rentResult == "paid">>
<span class="good">Rent paid: $<<print $rent>>.</span>
<br>
<<elseif $rentResult == "bailed">>
<span class="warning">Ashley covered the rent. She won't do it again.</span>
<br>
<</if>>
<<set $rentResult = null>>
<</widget>>
/* END: RENT FEEDBACK */
/* START: MAID FEEDBACK */
<<widget "maidFeedback">>
<<if $maid.billedThisWeek > 0>>
<span class="warning">Cleaning service billed: $<<print $maid.billedThisWeek>>.</span><br>
<<set $maid.billedThisWeek = 0>>
<</if>>
<<if $maid.lapsed>>
<span class="bad">You couldn't cover the cleaning service. It's been cancelled.</span><br>
<<set $maid.lapsed = false>>
<</if>>
<</widget>>
/* END: MAID FEEDBACK */
/* START: WIFE MOOD SHIFT */
/* Usage:
<<moodShift 1>> mood +1, no relationship change
<<moodShift -1 -2>> mood -1 AND relationship -2
<<moodShift 1 1>> mood +1 AND relationship +1
*/
<<widget "moodShift">>
<<set $wife.mood += _args[0]>>
<<if _args.length > 1>>
<<set $wife.relationship += _args[1]>>
<</if>>
<<if $wife.mood > 3>><<set $wife.mood = 3>><</if>>
<<if $wife.mood < -3>><<set $wife.mood = -3>><</if>>
<</widget>>
/* END: WIFE MOOD SHIFT */
/* START: WIFE MOOD RESET (called on dayshift) */
<<widget "moodReset">>
<<if $wife.relationship >= 60>>
<<set $wife.mood = 2>>
<<elseif $wife.relationship >= 25>>
<<set $wife.mood = 1>>
<<elseif $wife.relationship >= 0>>
<<set $wife.mood = 0>>
<<elseif $wife.relationship >= -10>>
<<set $wife.mood = -1>>
<<else>>
<<set $wife.mood = -2>>
<</if>>
<</widget>>
/* END: WIFE MOOD RESET */
/* START: SOLO VENT WIDGET */
/* Usage: drop <<soloVent "bedroom">> into a room passage.
The arg is the wife-location key for THIS room, so the widget
knows when she's present and the option should hide. */
<<widget "soloVent">>
<<set _here = _args[0]>>
<<if $arousal >= 3 and $wife.location !== _here and not $ventedToday>>
<<if $energy < 1 and $fitnessTier < 3>>
<br>//You're too drained to jerk off right now.//
<<else>>
<br><<link "Jerk off to some porn." "Solo Vent">><</link>>
<</if>>
<</if>>
<</widget>>
/* START: WEEKEND OUTING */
<<widget "weekendOuting">>
/* Saturday emergency callout: rare branch that pre-empts the outing.
Same time slot and resolution gates as the outing itself; the random
roll sits last so it only fires when everything else already passed. */
<<if $weekday == 6 and $time == 2 and not $wife.outingResolved and not $wife.outForDay and not $job.calloutPending and ($gameDay - $job.lastCalloutDay) >= $job.calloutCooldown and random(1, 100) <= 10>>
<<set $job.calloutPending = true>>
<<set $job.lastCalloutDay = $gameDay>>
<<goto "Weekend Helion Callout">>
<<else>>
<<if $weekday >= 6 and $time == 2 and not $wife.outingResolved>>
<<if $wife.mood <= -2 or $wife.relationship < 0>>
/* Excluded: she takes him out without you. */
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<<set $wife.location = "out">>
$wife.name is getting your son ready to go out, coat and little shoes by the door. She doesn't ask if you want to come. By the time you've thought of something to say, the door has already shut behind them.
<br>
<span class="warning">They've gone out without you.</span>
<br><br>
<<elseif $energy < 1>>
/* Offered, but you're too drained to join. */
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<<set $wife.location = "out">>
$wife.name is taking the boy out for the afternoon and asks if you're coming. You're running on empty, and she reads it on you before you've finished the excuse. She lets it go and takes him without you.
<br><br>
<<else>>
/* She comes to ask, in her own passage. */
<<goto "Weekend Outing Ask">>
<</if>>
<</if>>
<</if>>
<</widget>>
/* END: WEEKEND OUTING */
/* START: FRIEND DRINK */
<<widget "friendDrinkSetup">>
<<set $friend.drankToday = true>>
<<set $money -= 16>>
<<set $time = Math.min($time + 2, $timeMax)>>
<<set $drunk += 2>>
<<set $friend.relationship += 2>>
<<set _topics = ["old", "startup", "work", "ashley", "sports", "checkin"]>>
<<if $onsEver>><<set _topics.push("cheat_ons")>><</if>>
<<if $swEver>><<set _topics.push("cheat_sw")>><</if>>
<<if $swEver>>
<<set _topics.push("sw_suggest")>>
<<set _topics.push("sw_suggest")>>
<</if>>
<<set $friend.topic = _topics.random()>>
<<for _i = 0; $friend.topic === $friend.lastTopic and _i < 5; _i++>>
<<set $friend.topic = _topics.random()>>
<</for>>
<<set $friend.lastTopic = $friend.topic>>
<</widget>>
/* END: FRIEND DRINK */
/* START: MORNING SCENE ARBITER */
/* Single authority on which scene greets the player on waking.
Reads flags already set by the daily checks and applies priority
once. Highest priority first; exactly one wins. To add a new
morning claimant, insert one line at the correct rung. */
<<widget "dayResolveMorning">>
<<if $assistant.tripPending>>
/* The trip outranks the wife scenes, but their mechanical hits already
landed back in phase 8. Stash the scene so it plays the morning after
he gets home rather than vanishing with the damage already done. */
<<if $wife.discoveryToday>>
<<set $deferredMorning = "Wife Discovery">>
<<elseif $wife.ultimatumToday>>
<<set $deferredMorning = "Wife Ultimatum">>
<<elseif $wife.worryScoldToday>>
<<set $deferredMorning = "Wife Worry">>
<</if>>
<<set $morningScene = "Assistant, Trip Depart">>
<<elseif $wife.discoveryToday>>
<<set $morningScene = "Wife Discovery">>
<<elseif $wife.ultimatumToday>>
<<set $morningScene = "Wife Ultimatum">>
<<elseif $wife.worryScoldToday>>
<<set $morningScene = "Wife Worry">>
<<elseif $deferredMorning !== "">>
/* Replay a scene the trip preempted. moodReset has since wiped the mood
the original check set, so restore it or she delivers the line in a
neutral mood. */
<<set $morningScene = $deferredMorning>>
<<if $deferredMorning === "Wife Worry">>
<<set $wife.mood = -2>>
<<else>>
<<set $wife.mood = -3>>
<</if>>
<<set $deferredMorning = "">>
<<else>>
<<set $morningScene = "Bedroom">>
<</if>>
<</widget>>
/* END: MORNING SCENE ARBITER */<<widget "meter">>
/*
USAGE:
<<meter $energy $energyMax "Energy">>
OTHER EXAMPLES:
<<meter $fitness 45 "Fitness" "#FF9F40">>
<<meter $job.performance 20 "Promotion" "#3D73FC">>
<<meter $wife.relationship 50 "Ashley" "#FF9FB2">>
*/
<<set _current = Math.max(0, _args[0])>>
<<set _max = Math.max(1, _args[1])>>
<<set _label = _args.length > 2 ? _args[2] : "">>
<<set _color = _args.length > 3 ? _args[3] : "#6C9F56">>
<<set _pct = Math.floor((Math.min(_current, _max) / _max) * 100)>>
<<set _style = "width: " + _pct + "%; background: " + _color + ";">>
<div class="meter">
<div class="meter-fill" @style="_style"></div>
<span class="meter-text"><<= _label>> <<= _current>>/<<= _max>></span>
</div>
<</widget>><<widget "wifeSchedule">>
/* If she went out without you, she stays out until she's back in the early evening. Checked before the schedule so it overrides the time slot. */
<<if $wife.outForDay and $time < 5>>
<<set $wife.location = "out">>
<<else>>
/* Normal Schedule */
<<switch $time>>
/* Early Morning */
<<case 0>>
<<if $weekday >= 6>>
<<set $wife.location = "bedroom">>
<<else>>
<<set $wife.location = "kitchen">>
<</if>>
/* Late Morning */
<<case 1>>
<<if $weekday >= 6>>
<<set $wife.location = "kitchen">>
<<else>>
<<set $wife.location = "bathroom">>
<</if>>
/* Noon */
<<case 2>>
<<if $weekday >= 6>>
<<set $wife.location = "bathroom">>
<<else>>
<<set $wife.location = "out">>
<</if>>
/* Early Afternoon */
<<case 3>> <<set $wife.location = "out">>
/* Late Afternoon */
<<case 4>> <<set $wife.location = "out">>
/* Early Evening */
<<case 5>> <<set $wife.location = "kitchen">>
/* Evening */
<<case 6>> <<set $wife.location = "livingroom">>
/* Late Evening */
<<case 7>> <<set $wife.location = "bedroom">>
/* Night */
<<case 8>> <<set $wife.location = "bedroom">>
<</switch>>
<</if>>
/* Yoga sessions (requires mats): Wednesday late afternoon, Saturday late morning.
Overrides her normal location and flags the session for the living room.
doingYoga is recomputed every load, so it self-clears outside the slots. */
<<set $wife.doingYoga = false>>
<<if $items.yogaMats>>
<<if ($weekday == 3 and $time == 4) or ($weekday == 6 and $time == 1)>>
<<set $wife.location = "livingroom">>
<<set $wife.doingYoga = true>>
<</if>>
<</if>>
/* Wardrobe malfunction: rolled once per game day, cached for the night.
Only ever surfaces at Night (time 8) in the bedroom scene. Tune the rate. */
<<if $wife.wardrobeRollDay !== $gameDay>>
<<set $wife.wardrobeRollDay = $gameDay>>
<<set $wife.wardrobeMalfunction = (random(1, 100) <= 35)>>
<</if>>
/* Living-room tidying: rolled once per game day, cached. Only ever surfaces in
the evening living-room slot when she isn't doing yoga, and is consumed the
first time the player walks in on it. Tune the rate. */
<<if $wife.tidyRollDay !== $gameDay>>
<<set $wife.tidyRollDay = $gameDay>>
<<set $wife.tidyToday = (random(1, 100) <= 35)>>
<</if>>
/* Monthly cycle: a short window where sex is off the table (HJ/BJ depend on
relationship). Deterministic from $gameDay so it's consistent within a cycle;
cycleStart is randomized at game start so it isn't the same days every
playthrough. Recomputed each load, no caching needed. Tune the window (4) and
period (28). */
<<set _cyclePos = ($gameDay - $wife.cycleStart) % 28>>
<<if _cyclePos < 0>><<set _cyclePos += 28>><</if>>
<<set $wife.cycleOff = (_cyclePos < 4)>>
<</widget>>/* START OF: CHORE WIDGET */
/* Usage: <<chore "bedroom" "Tidy the bedroom.">> */
<<widget "chore">>
<<set _room = _args[0]>>
<<set _label = _args[1]>>
<<if !$chores[_room] and $arousal >= 8>>
//You're too horny to focus on this right now.//
<<elseif !$chores[_room] and $energy < 1>>
//You're too tired to do chores.//
<<elseif !$chores[_room] and $time >= $timeMax>>
//It's too late to start cleaning now.//
<<elseif !$chores[_room]>>
<<link _label $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $chores[_room] = true>>
<<choreCredit>>
<<moodShift 1>>
<</link>>
<<else>>
/* Nothing */
<</if>>
<</widget>>
/* END OF: CHORE WIDGET */
/* START: WIFE CREDIT (two tracks, same mechanics) */
/* UPKEEP. Called by <<chore>> and by the maid's daily auto-clean.
Keeps the house standing. She notices when it stops. */
<<widget "choreCredit">>
<<set $wife.choreToday = true>>
<<set $wife.choreCounter += 1>>
<<if $wife.choreCounter >= 4>>
<<set $wife.choreCounter = 0>>
<<if $wife.relationship < 50>>
<<set $wife.relationship += 1>>
<<set $wife.choreThanks = true>>
<</if>>
<</if>>
<</widget>>
/* CARE. Cooking, breakfast together, lazy mornings, holding her.
Nothing to do with the dishes. She notices when this stops too,
and it's the one the cleaning service can never buy. */
<<widget "careCredit">>
<<set $wife.careToday = true>>
<<set $wife.careCounter += 1>>
<<if $wife.careCounter >= 4>>
<<set $wife.careCounter = 0>>
<<if $wife.relationship < 50>>
<<set $wife.relationship += 1>>
<<set $wife.careThanks = true>>
<</if>>
<</if>>
<</widget>>
/* END: WIFE CREDIT *//* START OF: WORKOUT WIDGET */
/* Payment only. The gate and the link live in <<workout>>; call this
directly from any passage that needs its own link body, such as
Helion Gym, where an encounter roll sits inside the click.
Args: energyCost, timeCost, fitnessGain, moneyCost, arousalRelief.
Temp names are prefixed to avoid colliding with the caller's. */
<<widget "payWorkout">>
<<set _pwE = _args.length > 0 ? _args[0] : 1>>
<<set _pwT = _args.length > 1 ? _args[1] : 1>>
<<set _pwF = _args.length > 2 ? _args[2] : 1>>
<<set _pwM = _args.length > 3 ? _args[3] : 0>>
<<set _pwR = _args.length > 4 ? _args[4] : 0>>
<<set $energy = Math.max($energy - _pwE, 0)>>
<<set $time = Math.min($time + _pwT, $timeMax)>>
<<set $money -= _pwM>>
<<set $fitness += _pwF>>
<<set $arousal = Math.max($arousal - _pwR, 0)>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<</widget>>
/* Gate plus link. Usage unchanged:
<<workout "Go for a swim.">>
<<workout "Lift weights." 2 2>>
(label, energyCost, timeCost, fitnessGain, moneyCost, arousalRelief)
*/
<<widget "workout">>
<<set _label = _args[0]>>
<<set _energyCost = _args.length > 1 ? _args[1] : 1>>
<<set _timeCost = _args.length > 2 ? _args[2] : 1>>
<<set _fitnessGain = _args.length > 3 ? _args[3] : 1>>
<<set _moneyCost = _args.length > 4 ? _args[4] : 0>>
<<set _arousalRelief = _args.length > 5 ? _args[5] : 0>>
<<if $arousal >= 8>>
//You can't focus on training while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < _energyCost>>
//You're too exhausted to train right now.//
<<elseif $time >= $timeMax>>
//It's too late to get a proper workout in now.//
<<elseif $money < _moneyCost>>
//You can't afford a session right now.//
<<else>>
<<link _label $return>>
<<payWorkout _energyCost _timeCost _fitnessGain _moneyCost _arousalRelief>>
<</link>>
<</if>>
<</widget>>
/* END OF: WORKOUT WIDGET */
/* BEGIN: FITNESSCHECK */
<<widget "fitnesscheck">>
/* Store previous tier */
<<set _oldTier = $fitnessTier>>
/* Determine tier */
<<if $fitness >= 45>>
<<set $fitnessTier = 5>>
<<elseif $fitness >= 30>>
<<set $fitnessTier = 4>>
<<elseif $fitness >= 20>>
<<set $fitnessTier = 3>>
<<elseif $fitness >= 15>>
<<set $fitnessTier = 2>>
<<elseif $fitness >= 10>>
<<set $fitnessTier = 1>>
<<else>>
<<set $fitnessTier = 0>>
<</if>>
/* Energy cap climbs over the first two tiers, then plateaus at 7.
Tier 3+ rewards are perks, not more energy. */
<<if $fitnessTier >= 2>>
<<set $energyMax = 7>>
<<elseif $fitnessTier == 1>>
<<set $energyMax = 6>>
<<else>>
<<set $energyMax = 5>>
<</if>>
/* Reset flags */
<<set $fitnessTierUp = false>>
<<set $fitnessTierDown = false>>
/* Detect direction */
<<if $fitnessTier > _oldTier>>
<<set $fitnessTierUp = true>>
<<elseif $fitnessTier < _oldTier>>
<<set $fitnessTierDown = true>>
<</if>>
<</widget>>
/* END: FITNESSCHECK */
/* BEGIN: Fitness Feedback */
<<widget "fitnessFeedback">>
<<if $fitnessTierUp>>
<span class="good">Fitness level increased.</span><br>
<<set $fitnessTierUp = false>>
<</if>>
<<if $fitnessTierDown>>
<span class="bad">Fitness level dropped.</span><br>
<<set $fitnessTierDown = false>>
<</if>>
<<if $fitnessWarning>>
<span class="warning">You feel sluggish. It's been a while since you trained.</span><br>
<<set $fitnessWarning = false>>
<</if>>
<</widget>>
/* END: Fitness Feedback */
/* START: FITNESS-GATED ENERGY */
/* Energy cost for a sexual act or solo vent, waived once the body is
conditioned enough (tier 3+) to take it in stride. Usage: <<sexEnergy 1>> */
<<widget "sexEnergy">>
<<if $fitnessTier < 3>>
<<set $energy = Math.max($energy - _args[0], 0)>>
<</if>>
<</widget>>
/* END: FITNESS-GATED ENERGY */<<widget "exCheck">>
/* Runs once per dayshift. A few days after she gets your number,
a text queues up. Tune the 3-day delay and the 45% roll. */
<<if $ex.live and not $ex.pending and ($gameDay - $ex.day) >= 3>>
<<if random(1, 100) <= 45>>
<<set $ex.pending = true>>
<</if>>
<</if>>
<</widget>>
<<widget "exPing">>
/* _args: this room's wife-location key.
With her in the room, it's a scare. Alone, once you've kept the
number, it's the second-round text. */
<<if $ex.pending>>
<<if $ex.saved>>
<<goto "ONS Ex Opportunity">>
<<elseif $wife.location == _args[0]>>
<<goto "ONS Ex Scare">>
<</if>>
<</if>>
<</widget>>
<<widget "galleryAdd">>
/* _args[0] = full image path, _args[1] = caption.
Dedupes by path: an image already in the gallery is never stored twice. */
<<if not $phone.gallery.some(g => g.img === _args[0])>>
<<set $phone.gallery.push({img: _args[0], caption: _args[1], day: $gameDay})>>
<<set $phone.galleryNew += 1>>
<</if>>
<</widget>>/* TIME OF DAY */
<<widget "timeofday">>
<<switch $time>>
<<case 0>>Early Morning
<<case 1>>Late Morning
<<case 2>>Noon
<<case 3>>Early Afternoon
<<case 4>>Late Afternoon
<<case 5>>Early Evening
<<case 6>>Evening
<<case 7>>Late Evening
<<case 8>>Night
<</switch>>
<</widget>>
/* WEEKDAY */
<<widget "weekday">>
<<switch $weekday>>
<<case 1>>Monday
<<case 2>>Tuesday
<<case 3>>Wednesday
<<case 4>>Thursday
<<case 5>>Friday
<<case 6>>Saturday
<<case 7>>Sunday
<</switch>>
<</widget>>
/* START: DATETIME DISPLAY */
<<widget "datetime">>
<<weekday>> - <<timeofday>>
<</widget>>
/* END: DATETIME DISPLAY */
/* START: TIMELINK */
/*
<<timelink "Text" "Passage" cost>>
Creates a link that advances time by a set amount (cost)
before moving to another passage.
- cost = number of time phases added (0–6 total)
- Automatically blocks usage at Night
- Clamps time so it never exceeds Night
*/
<<widget "timelink">>
<<if $time >= $timeMax>>
<span class="disabled"> <<= _args[0] >> (too late)</span>
<<else>>
<<link _args[0]>>
<<set $time += _args[2]>>
<<if $time > $timeMax>><<set $time = $timeMax>><</if>>
<<goto _args[1]>>
<</link>>
<</if>>
<</widget>>
/* END: TIMELINK *//* START: WIFE REACTIONS */
<<widget "wifeReact">>
/* Scold: the house */
<<if $wife.choreScold>>
<<set _l = [
"I came home to the sink again. I work a full shift and then I clean up after all three of us, and I can't keep doing it and pretending I don't mind.",
"Do you actually see it? The mess. Or does it just not register until I've dealt with it.",
"I'm not your mother. I've got a job and a four-year-old and somehow I've also got you. How hard can it be to help out with the housework?"
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.choreScold = false>>
<<set $wife.careScold = false>>
/* Scold: the distance */
<<elseif $wife.careScold>>
<<set _l = [
"You've been here all week. In the flat, I mean. I don't think you've actually looked at me once. Why aren't talking anymore?",
"We haven't had a real conversation in days. You should focus more on us. You're in the room and you're not in the room.",
"We never do anything together. I'd rather you shouted at me than this. At least then I'd know you'd noticed I was here."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.careScold = false>>
/* Scold: the duty */
<<elseif $wife.dutyScold>>
<<set _l = [
"I get you off because you ask, and because it's easier than the argument. I'm aware of the difference, even if you're not.",
"You know I'm not there, right? When we're intimate. You know that, but you just wanna get off right? I keep waiting for you to notice and stop asking.",
"It's not that I mind. It's that you don't seem to care as long as you get to empty your balls. That's the part that's getting to me."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.dutyScold = false>>
/* Interaction responses */
<<elseif $wife.lastInteraction == "talked">>
<<switch $wife.talkTopic>>
<<case "kid">>
<<speech "You" $name>>
He's getting big, isn't he. Feels like it happened while I wasn't looking.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
He is. Got your stubborn streak, God help me. Plants his feet exactly the way you do when he's decided something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
He is. And he notices more than you'd think. Worth remembering, next time you assume he doesn't.
<</speech>>
<</if>>
<<case "past">>
<<speech "You" $name>>
Remember that first apartment we got after college? The one with the screaming boiler.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
God, that place. We put a mattress on the floor and called it furnished. Broke as anything. I don't think I've been happier since.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Don't. I can't do the good-old-days thing right now. It just makes this one look worse.
<</speech>>
<</if>>
<<case "plans">>
<<speech "You" $name>>
You ever think about what's next? For us, I mean.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I don't know. Smaller plans than I used to make. But not none. That's something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Plans. Right. Let's just get through the month first, and then we'll dream big.
<</speech>>
<</if>>
<<case "cheer">>
<<speech "You" $name>>
So. Reckon you can still pull off any of those cheerleader moves, or is that strictly a museum piece now?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Watch it. I could still put my foot above your head, and don't think I won't demonstrate on the wrong part of you.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
That girl had a flat stomach and a future. Let's not poke at her.
<</speech>>
<</if>>
<<case "castings">>
<<speech "You" $name>>
Do you ever miss it? The auditions, the castings, all that.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I miss the work. Not the rest. Half those rooms were some sweaty producer telling me to "loosen up" with the door shut. You learn to keep your back to a wall.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Miss being looked up and down by men who'd "see what they could do" for me? No. I got very good at the polite no and the fast exit. That's the part nobody puts on a headshot.
<</speech>>
<</if>>
<<case "sofa">>
<<speech "You" $name>>
You still thinking about that sofa you showed me? The gray one.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I am, actually. Ours has a spring that's basically trying to escape. But it can wait. I know money's money right now.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Forget the sofa. I shouldn't have brought it up. We can't, and we both know it.
<</speech>>
<</if>>
<<case "shower">>
<<speech "You" $name>>
That showerhead's still dripping, you know. Drives me up the wall.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
So fix it, big man. You used to be handy, somewhere under all that. I'll even pretend to be impressed.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
And? You're the man of the house, supposedly. Or do we wait for it to flood and call someone we can't pay?
<</speech>>
<</if>>
<<case "shape">>
<<speech "You" $name>>
I've been trying to get back in shape. Noticing any difference?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
A bit, actually. You stand differently. I clocked it before you said anything, if that tells you something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Trying. Okay. Ask me again when there's something to notice.
<</speech>>
<</if>>
<<case "restaurant">>
<<speech "You" $name>>
You never talk about the restaurant. How is it, really?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Loud. Hot. The owner's nephew treats the schedule as a suggestion, so I cover his shifts and he gets the thanks. But the girls are good. We laugh. It's mine, at least, the bit of it that is.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
It's a floor and a lot of plates. It pays for the daycare that lets me work it. Round and round. Let's not.
<</speech>>
<</if>>
<<case "boxing">>
<<speech "You" $name>>
I've been thinking about the ring again. Not just the bag down at Vance's. The real thing.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
There he is. You used to talk about that with your whole face. Go on then, get your nose broken. I'll pretend to disapprove and secretly like it.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Another comeback. The ring, the company, the grand plan. I married a man with a whole drawer of them. Show me one that finished.
<</speech>>
<</if>>
<<case "startup">>
<<speech "You" $name>>
I still run the company through my head sometimes. The parts I'd do differently.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I know you do. I catch you at it across the table. I never thought you were a fool for trying. Just for doing it with your back to your own front door.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I can't go back there with you. I'm still living in what it cost. You get to replay it, I get to pay for it. That's the deal we ended up with.
<</speech>>
<</if>>
<<case "affection">>
<<speech "You" $name>>
I don't say it enough. That I'm glad it's still you and me here.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
No, you don't. But you said it now, and I'll take the now. Don't make me wait so long for the next one.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Glad. Right. You've a funny way of showing it most days. But... noted.
<</speech>>
<</if>>
<<case "coffee">>
<<speech "You" $name>>
We're nearly out of the decent coffee. The bag you hide behind the lentils.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
You found it. Of course you found it. Fine, we ration it. One proper cup each on Sundays, like people with their lives together.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
So we drink the cheap stuff. It's not like we're hosting anyone. Save the good bag for a day that earns it.
<</speech>>
<</if>>
<<case "reality">>
<<speech "You" $name>>
Wait, which one's that, the one with the sex tape or the one with the make-up empire? They all blur into one.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
The make-up one. The tape was the older sister, do keep up. For a man who can untangle code nobody else can read, you cannot hold three famous women apart to save your life.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Does it matter? They're famous for being famous. I'm not your search engine for people neither of us will ever meet.
<</speech>>
<</if>>
<<case "canal">>
<<speech "You" $name>>
Saw a backpack just floating in the canal on the way back. Makes you wonder what's in it.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Oh, that's a body. That's episode one. Jogger finds a bag, ominous narrator, and forty minutes later it's always the quiet husband. Always. You'd be perfect for the reenactment, you've got the face for it.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Probably some kid's gym clothes. Not everything's a mystery. Some things are just rubbish in the water, like most things around here.
<</speech>>
<</if>>
<<case "series">>
<<speech "You" $name>>
Are we ever finishing that series, or is it just going to sit at three-episodes-in forever?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
We are finishing it. I've decided the brother did it and I need to be proved right. Tonight, once he's down. You make the tea, I'll fight you for the good end of the sofa.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
When, exactly? You're never on the sofa when I am, and when you are you're asleep in ten minutes. Watch it without me. Or don't.
<</speech>>
<</if>>
<<case "documentary">>
<<speech "You" $name>>
There was a documentary on about people who just walk away from their whole lives. Vanish, start again somewhere new.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Tempting, isn't it. I price it up some days. New name, a town by the sea, nobody who knows me. Then he shouts for me from the other room and that's that. You're stuck with me, sorry.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I caught a bit of it. Don't go reading anything into which bit.
<</speech>>
<</if>>
<<case "takeout">>
<<speech "You" $name>>
What I wouldn't give for a proper takeout tonight. The good place, not the one where everything's beige.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Don't, my stomach just filed a complaint. One day we get the good place, all the extra sides, and we don't even look at the prices. I'm picturing it. Vividly.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
We're not getting a takeout and you know it. Saying it out loud just makes the lentils taste worse.
<</speech>>
<</if>>
<<case "neighbor">>
<<speech "You" $name>>
The pair upstairs were going again this morning. Kid and the thumping, six on the dot.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Our little alarm clock. At least ours sleeps to seven now, small mercies. I keep meaning to actually meet them. Shared a ceiling for months and I couldn't pick them out of a lineup.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
And what would you like me to do about the neighbors? Add it to the list of things that are nobody's fault and somehow still mine.
<</speech>>
<</if>>
<<case "dream">>
<<speech "You" $name>>
You were talking in your sleep last night. Full sentences. Something about a swan.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I was not. Was I? God, what did I say, because if I'm narrating my dreams to you now I'd like to know what I'm working with. A swan. Wonderful. Very normal wife you landed.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Was I. I probably get more said asleep than I manage awake in this place. Wouldn't take much.
<</speech>>
<</if>>
<<case "lottery">>
<<speech "You" $name>>
If a stupid amount of money landed tomorrow, no strings. First thing you'd do.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Easy. Sleep. A solid week of it, in a bed nobody climbs on at dawn. Then the coast, the good coffee, a door that locks. I've had this list a long while, if that wasn't obvious.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I don't play that game anymore. We did 'imagine when we're rich' for years, and look where the imagining landed us. I deal in what's in the account now.
<</speech>>
<</if>>
<<case "music">>
<<speech "You" $name>>
That song came on at the store the other day. The one that was always on, back then. Stood in the cereal aisle like an idiot.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Ours. The one you butchered at that party, and somehow I still went home with you. Can't hear it without smelling cheap vodka. Best worst night of my life. Hum it and I'll deny all of this.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
A song's a song. I can't go misty over a jingle with the rent where it is. Nice you've got the spare attention for it, though.
<</speech>>
<</if>>
<<default>>
<<speech "You" $name>>
No reason. Just felt like talking.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Mm. It's been a while since we just talked like this.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Yeah. Sure.
<</speech>>
<</if>>
<</switch>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_fail">>
<<if $wife.mood <= -2>>
<<speech "Wife" $wife.name>>
Don't even think about it.
<</speech>>
<<elseif $wife.mood <= -1>>
<<speech "Wife" $wife.name>>
Really? Right now?
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not now. I'm not feeling it.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_cold">>
<<speech "Wife" $wife.name>>
Not right now. It's been a day.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_notyet">>
<<speech "Wife" $wife.name>>
No. Not yet, not like this. You don't get to skip to that part because you feel like it tonight.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_spent">>
<<if $wife.relationship >= 60>>
<<speech "Wife" $wife.name>>
Mm, give me a little to recover first. You'll have me again soon enough.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not again so soon. I'm not a switch you get to flip whenever you want.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_period">>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I'm on my period, love. Cramping, exhausted, the whole show. Ask me again in a few days and I'll be a lot more fun.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I'm on my period, I've had four hours' sleep, and that's where your head goes? Read the fucking room.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_tooSoon">>
<<speech "Wife" $wife.name>>
Hey... not yet. I'm not in that place with you right now. We need to work more on us first.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "affection_refuse">>
<<if $wife.mood <= -2>>
<<speech "Wife" $wife.name>>
Don't. I'm not in the mood to be touched right now.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not right now. I just... not right now.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
/* Thanks: the house */
<<elseif $wife.choreThanks and $wife.mood >= 0>>
<<set _l = [
"The place has been... nice, lately. I keep walking in and there's nothing waiting for me. You've no idea what that's worth.",
"I came home to a clean kitchen. Twice this week. I nearly checked I was in the right flat.",
"You've been picking up after him without being asked. I noticed, and it means a lot to me."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.choreThanks = false>>
<<elseif $wife.choreThanks>>
<<set $wife.choreThanks = false>>
/* Thanks: the closeness */
<<elseif $wife.careThanks and $wife.mood >= 0>>
<<set _l = [
"You've been different lately. More present. I noticed a while ago, I just didn't want to say it out loud in case it stopped.",
"We've been talking with each other again. Properly, I mean. I'd forgotten what that was like.",
"We've been closer lately. Whatever it is you're doing, don't stop. That's all. That's the whole speech."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.careThanks = false>>
<<elseif $wife.careThanks>>
<<set $wife.careThanks = false>>
/* High arousal: she clocks that you're somewhere else */
<<elseif $arousal >= 7 and not $wife.arousalNoticedToday>>
<<set $wife.arousalNoticedToday = true>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
You're somewhere else today. I can tell. You get this look.
<</speech>>
<<elseif $wife.mood >= -1>>
<<speech "Wife" $wife.name>>
Why are you looking at me up and down like that, weirdo?
<</speech>>
<<moodShift -1>>
<<else>>
<<speech "Wife" $wife.name>>
Don't look at me like that. I'm not some piece of meat.
<</speech>>
<<moodShift -1 -1>>
<</if>>
<</if>>
<br>
<</widget>>
/* END: WIFE REACTIONS */
/* START: WIFE SUSPICION */
/* Register a physical infidelity. Severity scales the suspicion gain.
Suggested: HJ 1, BJ 2, sex 3. Office tryst 1.
Re-arms the discovery system (lifts the lockout). */
<<widget "addSuspicion">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<set $wife.suspicion += _amt>>
<<set $wife.cheatedToday = true>>
<<set $wife.suspicionLocked = false>>
<</widget>>
/* Daily: decay on faithful days, then roll for discovery.
Called once inside dayshift. */
<<widget "suspicionCheck">>
/* Clear yesterday's discovery state */
<<set $wife.discoveryToday = false>>
<<set $wife.discoveryResult = 0>>
/* Decay if no infidelity since the last dayshift */
<<if not $wife.cheatedToday>>
<<set $wife.suspicion = Math.max($wife.suspicion - 1, 0)>>
<</if>>
<<set $wife.cheatedToday = false>>
/* Discovery roll: only if armed and there is something to find */
<<if not $wife.suspicionLocked and $wife.suspicion > 0>>
<<set _chance = Math.max(0, Math.min(90, ($wife.suspicion * 6) - ($wife.relationship * 0.4)))>>
<<if random(1, 100) <= _chance>>
<<set _hit = Math.max(5, Math.min(25, 5 + $wife.suspicion))>>
<<set $wife.relationship -= _hit>>
<<set $wife.suspicion = Math.floor($wife.suspicion / 2)>>
<<set $wife.suspicionLocked = true>>
<<set $wife.mood = -3>>
<<set $wife.discoveryResult = _hit>>
<<set $wife.discoveryToday = true>>
<</if>>
<</if>>
<</widget>>
/* END: WIFE SUSPICION */
/* START: WIFE WORRY */
/* Register reckless, self-destructive behaviour. Severity scales the gain.
Suggested: bare-knuckle fight 2. Drinking flows through $drunk, not here. */
<<widget "addWorry">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<set $wife.worry += _amt>>
<<set $wife.recklessToday = true>>
<</widget>>
/* Daily: she reads the state you came home in, worry decays on clean days,
then she may finally say something. Called once inside dayshift. */
<<widget "worryCheck">>
/* Clear yesterday's scold scene flag */
<<set $wife.worryScoldToday = false>>
<<set $wife.worryResult = 0>>
/* She can tell when you've been drinking. Heavier nights land harder.
addWorry also sets recklessToday, so a drunk night won't then decay. */
<<if $drunk >= 4>>
<<addWorry 2>>
<<elseif $drunk >= 2>>
<<addWorry 1>>
<</if>>
<<set $drunk = 0>>
/* Decay on a clean, sober day */
<<if not $wife.recklessToday>>
<<set $wife.worry = Math.max($wife.worry - 1, 0)>>
<</if>>
<<set $wife.recklessToday = false>>
/* Fed up: a scold and a relationship hit, deliberately smaller than a
discovery. Deferred if a heavier confrontation is already playing today,
so worry stays intact and fires cleanly on the next eligible morning. */
<<if $wife.worry >= 6 and not $wife.discoveryToday and not $wife.ultimatumToday>>
<<set _hit = Math.max(3, Math.min(8, Math.floor($wife.worry / 2)))>>
<<set $wife.relationship -= _hit>>
<<set $wife.worry = Math.floor($wife.worry / 2)>>
<<set $wife.mood = -2>>
<<set $wife.worryResult = _hit>>
<<set $wife.worryScoldToday = true>>
<</if>>
<</widget>>
/* END: WIFE WORRY */
/* START: MARRIAGE ENDGAME */
<<widget "marriageCheck">>
/* Clear yesterday's one-day scene flag */
<<set $wife.ultimatumToday = false>>
/* Ongoing pressure once the warning has landed: a slow bleed so a marriage
parked at rock bottom keeps sliding toward divorce instead of stalling
forever in the -30 to -40 band. Applied before the threshold checks so it
can be the thing that tips the divorce. Tune the -1 to taste. */
<<if $wife.ultimatumShown and $wife.relationship > -20>>
<<set $wife.relationship -= 1>>
<</if>>
/* Terminal: the warning was given and things kept sliding. Held off while an
ultimatum is sitting in $deferredMorning, i.e. it was armed but the trip
preempted the scene and it hasn't been played back yet. Without this the
player can reach the divorce ending having never seen the warning, which
is the exact thing the deferral below exists to prevent. */
<<if $wife.ultimatumShown and $wife.relationship <= -20 and $deferredMorning !== "Wife Ultimatum">>
<<set $gameOverCause = "divorce">>
<<set $gameRunning = false>>
<<goto "Game Over">>
/* First time at rock bottom: deliver the ultimatum and arm the divorce.
Only commit ultimatumShown when we can actually SHOW the scene. If a
discovery confrontation is already playing today, defer: leave
ultimatumShown false so this fires on the next eligible dayshift. That
guarantees the player always gets the explicit warning before divorce
is ever possible. */
<<elseif not $wife.ultimatumShown and $wife.relationship <= -10>>
<<if not $wife.discoveryToday>>
<<set $wife.ultimatumShown = true>>
<<set $wife.ultimatumToday = true>>
<<set $wife.mood = -3>>
<</if>>
/* Recovery: clawed back to safer ground, re-arm for the future. */
<<elseif $wife.ultimatumShown and $wife.relationship >= -5>>
<<set $wife.ultimatumShown = false>>
<</if>>
<</widget>>
/* END: MARRIAGE ENDGAME */
/* START: DATE */
/* Usage: <<dateStart "picnic" 15 true>> (type, cost, alcohol) */
<<widget "dateStart">>
<<set $wife.dateType = _args[0]>>
<<set $money -= _args[1]>>
<<set $wife.dateToday = true>>
<<set $wife.lastDateDay = $gameDay>>
<<set $time = Math.min($time + 2, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<if _args[2]>>
<<set $wife.tipsy = true>>
<<set $wife.wineToday = true>>
<</if>>
<</widget>>
/* END: DATE */
/*START: WIFE INTIMACY COOLDOWN*/
/* One shared intimacy cooldown. Any act (HJ/BJ/sex) starts it; nothing is
available again until it expires. Gap shrinks as the marriage heals:
~5 days at the low end, 0 (daily) once she's fully back. Tune freely. */
<<widget "intimacyReady">>
<<if $wife.relationship >= 85>>
<<set _gap = 0>>
<<elseif $wife.relationship >= 70>>
<<set _gap = 1>>
<<elseif $wife.relationship >= 55>>
<<set _gap = 2>>
<<elseif $wife.relationship >= 40>>
<<set _gap = 3>>
<<else>>
<<set _gap = 3>>
<</if>>
<<set _ready = ($gameDay - $wife.lastIntimacyDay) >= _gap>>
<</widget>>
/*END: WIFE INTIMACY COOLDOWN*/
/* START: WIFE WARMTH (intimacy enjoyment tier) */
/* Sets _warmth: 0 reluctant, 1 warm, 2 eager.
Relationship sets the base band; mood nudges it one step either way,
so she can warm up on a good day or close off on a bad one even at the
same relationship. _args[0] and _args[1] are the relationship cutoffs
for this act (warm at >= first, eager at >= second), since each act
warms up at a different pace. */
<<widget "wifeWarmth">>
<<set _warmCut = _args[0]>>
<<set _eagerCut = _args[1]>>
/* Base band from relationship */
<<if $wife.relationship >= _eagerCut>>
<<set _w = 2>>
<<elseif $wife.relationship >= _warmCut>>
<<set _w = 1>>
<<else>>
<<set _w = 0>>
<</if>>
/* Mood nudge: a good mood can lift her a step, a sour one drops her */
<<if $wife.mood >= 2>>
<<set _w += 1>>
<<elseif $wife.mood <= -1>>
<<set _w -= 1>>
<</if>>
/* Clamp 0..2 */
<<set _warmth = Math.max(0, Math.min(2, _w))>>
<</widget>>
/* END: WIFE WARMTH *//* START: WORK CHECK */
<<widget "workCheck">>
<<if $weekday <= 5 and !$job.attendedToday and $time >= 2>>
<<set $job.daysMissed += 1>>
<<set $job.performance -= 1>>
<<set $job.attendedToday = true>>
<<set $job.missedToday = true>>
<<moodShift -1>>
/* Friday payday still triggers if missed */
<<if $weekday == 5>>
<<payday>>
<</if>>
<</if>>
<</widget>>
/* END: WORK CHECK */
/* START: PAYDAY */
<<widget "payday">>
<<set _totalDays = $job.daysWorked + $job.daysMissed>>
<<if _totalDays > 0>>
<<set _attendance = $job.daysWorked / _totalDays>>
<<else>>
<<set _attendance = 0>>
<</if>>
<<set _maxPay = $job.wage * 5>>
<<set _pay = Math.floor(_maxPay * _attendance)>>
<<set $money += _pay>>
/* Flag the result for paydayFeedback to display */
<<set $job.paidThisWeek = _pay>>
<<set $job.lastAttendance = _attendance>>
/* Reset week */
<<set $job.daysWorked = 0>>
<<set $job.daysMissed = 0>>
<<promotionCheck>>
<</widget>>
/* END: PAYDAY */
/* START: PAYDAY FEEDBACK */
<<widget "paydayFeedback">>
<<if $job.paidThisWeek !== null>>
<<if $job.lastAttendance >= 1>>
<span class="good">Payday: $<<print $job.paidThisWeek>> received for a full week.</span>
<<elseif $job.lastAttendance >= 0.6>>
<span class="warning">Payday: $<<print $job.paidThisWeek>> received (reduced).</span>
<<else>>
<span class="bad">Payday: Only $<<print $job.paidThisWeek>> after a poor week.</span>
<</if>>
<br>
<<set $job.paidThisWeek = null>>
<</if>>
<</widget>>
/* END: PAYDAY FEEDBACK */
/* START: CLOCK IN (shared by Workday and Promotion) */
<<widget "clockIn">>
<<if !$job.attendedToday>>
<<set $job.attendedToday = true>>
<<set $job.daysWorked += 1>>
/* Arousal sabotages focus: no performance gain if you came in wound up */
<<if $arousal >= 8>>
<<set $job.distractedToday = true>>
<<else>>
<<set $job.performance += 1>>
<<set $job.distractedToday = false>>
<</if>>
<<set $energy = Math.max($energy - 3, 0)>>
<<set $time = 4>>
<<if $weekday == 5>>
<<payday>>
<</if>>
/* Roll for a workday event (suppressed on promotion days) */
<<set $job.eventToday = false>>
<<set $job.eventOutcome = "">>
<<if not $job.promotionPending and ($gameDay - $job.lastEventDay) >= $job.eventCooldown>>
<<if $job.level >= 4>>
<<set _eventChance = 35>> /* participant tier: rarer on purpose */
<<else>>
<<set _eventChance = 20 + ($job.level * 8)>> /* L1=28%, L2=36%, L3=44% */
<</if>>
<<if random(1, 100) <= _eventChance>>
<<set $job.eventToday = true>>
<<set $job.lastEventDay = $gameDay>>
<</if>>
<</if>>
/* Roll for a draining work event. Rare, cooldowned, never on a
promotion day. Passive = silent extra energy hit, flavored at the
bottom of the Workday passage. Late = a choice offered in-passage. */
<<set $job.drainType = "">>
<<set $job.stayedLate = false>>
<<if not $job.promotionPending and ($gameDay - $job.lastDrainDay) >= $job.drainCooldown>>
<<if random(1, 100) <= 15>> /* ~15% on eligible days; tune freely */
<<set $job.lastDrainDay = $gameDay>>
<<if random(1, 100) <= 55>>
<<set $job.drainType = "passive">>
<<set $energy = Math.max($energy - 1, 0)>>
<<else>>
<<set $job.drainType = "late">>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
/* END: CLOCK IN */
/* START: PROMOTION CHECK (called inside payday) */
<<widget "promotionCheck">>
<<if not $job.promotionPending>>
<<set _next = $job.level + 1>>
<<set _qualified = false>>
<<switch _next>>
<<case 2>><<if $job.performance >= 10>><<set _qualified = true>><</if>>
<<case 3>><<if $job.performance >= 25>><<set _qualified = true>><</if>>
<<case 4>><<if $job.performance >= 45>><<set _qualified = true>><</if>>
<<case 5>><<if $job.performance >= 60>><<set _qualified = true>><</if>>
<</switch>>
<<if _qualified>>
<<set $job.promotionPending = true>>
<</if>>
<</if>>
<</widget>>
/* END: PROMOTION CHECK */
/* START: APPLY PROMOTION (called by the promotion event) */
<<widget "applyPromotion">>
<<set $job.level += 1>>
<<switch $job.level>>
<<case 2>>
<<set $job.title = "Software Engineer">>
<<set $job.wage = 150>>
<<case 3>>
<<set $job.title = "Senior Software Engineer">>
<<set $job.wage = 225>>
<<case 4>>
<<set $job.title = "Lead Engineer">>
<<set $job.wage = 325>>
<<case 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<</switch>>
<<set $job.promotionPending = false>>
<</widget>>
/* END: APPLY PROMOTION */
/* START: PROJECT PAYOUT FEEDBACK */
<<widget "projectPayoutFeedback">>
<<if $project.lastPayout > 0>>
<span class="good">Supporter income: $<<print $project.lastPayout>> from your project page.</span><br>
<<set $project.lastPayout = 0>>
<</if>>
<</widget>>
/* END: PROJECT PAYOUT FEEDBACK */<h2>With $wife.name</h2>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_affection1.jpeg', 'images/characters/w/w_affection2.jpeg', 'images/characters/w/w_affection3.jpeg', 'images/characters/w/w_affection4.jpeg')" width="100%">
</div>
<br>
<<if $wife.relationship >= 50>>
<<set _lines = [
"You pull her in and she comes easily, folding against your chest like it's the most natural thing in the world. Her arms go round you and stay, and for a while neither of you says anything, because nothing needs saying. You can feel her breathing slow against you.",
"She lets you draw her close and tucks her head under your chin, one hand flat against your back. The day goes quiet around the two of you. It's the kind of closeness you'd half forgotten you were allowed, and she holds on a beat longer than you expect.",
"You wrap her up and she melts into it, no hesitation, no bracing. Her fingers curl into your shirt. You stand there together in the small warm silence of it, and you feel something in your chest unknot that you hadn't noticed was tight."
]>>
<<elseif $wife.relationship >= 25>>
<<set _lines = [
"You reach for her and she comes, after the smallest pause, settling into your arms. It isn't the easy thing it once was, not quite, but she stays, her cheek against your shoulder, and the staying is the point.",
"She lets you hold her. Her arms come up around you, a little careful, like she's relearning the shape of it. But she doesn't pull back, and after a moment you feel her relax by a degree against you.",
"You draw her in and she allows it, resting against you with a quiet sigh. There's still a thin distance in it, but it's smaller than it was, and she doesn't seem in any hurry to step out of your arms."
]>>
<<else>>
<<set _lines = [
"You reach for her and she stiffens for a second before letting you hold her, stiff and unsure, her hands resting lightly at your sides. It isn't much. But she doesn't push you away, and for now that's its own small thing.",
"She lets you pull her into a loose embrace, more tolerated than returned. Her body stays a little guarded against yours. Still, she stays put for the length of it, and that's not nothing, the way things have been.",
"You hold her, and she permits it, her arms slow to rise and slower to settle. There's a wariness she can't quite put down. But she stays in the circle of your arms a moment, and lets the moment be what it is."
]>>
<</if>>
<<= _lines.random()>>
<br><br>
<<if $wife.relationship >= 50>>
<<set _say = [
"We don't do this enough anymore. I missed it.",
"Mm. Stay here a second. Just like this.",
"I needed that. More than I'd have admitted, if you'd asked."
]>>
<<elseif $wife.relationship >= 25>>
<<set _say = [
"...That's nice. It's been a while since you just held me.",
"Okay. Okay, that's... yeah. I'll take that.",
"Don't make a thing of it. But thank you."
]>>
<<else>>
<<set _say = [
"...Alright. That's enough for now.",
"I don't know what's gotten into you. But it's not the worst thing.",
"Hm. Well. Don't let it go to your head."
]>>
<</if>>
<<speech "Wife" $wife.name>>
<<= _say.random()>>
<</speech>>
<br>
<<link "Step back." "Wife Interact">><</link>><h2>With $wife.name</h2>
<<if $wife.mood >= 1>>
She raises an eyebrow, but there's a smile behind it.
<br><br>
<<speech "Wife" $wife.name>>
Alright. Where are you taking me?
<</speech>>
<br>
<<else>>
She looks at you for a moment, weighing something. Then she nods, once.
<br><br>
<<speech "Wife" $wife.name>>
Okay. Where?
<</speech>>
<br>
<</if>>
The girl from upstairs will watch the boy. Short notice, but for some cold cash, she always says yes.
<br><br>
''Where to?''
<br>
<<if $money >= 40>>
<<link "A picnic down by the canal. ($40)" "Wife Date Scene">>
<<dateStart "picnic" 40 true>>
<</link>>
<<else>>
//A picnic by the canal ($40), but you're short.//
<</if>>
<br>
<<if $money >= 60>>
<<link "Darts and drinks at the Anchor. ($60)" "Wife Date Scene">>
<<dateStart "bar" 60 true>>
<</link>>
<<else>>
//Darts at the Anchor ($60), but you're short.//
<</if>>
<br>
<<if $money >= 70>>
<<link "A film at the multiplex past the bypass. ($70)" "Wife Date Scene">>
<<dateStart "cinema" 70 false>>
<</link>>
<<else>>
//The multiplex ($70), but you're short.//
<</if>>
<br>
<<if $money >= 120>>
<<link "Dinner at the Italian place in town. ($120)" "Wife Date Scene">>
<<dateStart "restaurant" 120 true>>
<</link>>
<<else>>
//The Italian place ($120), but you're short.//
<</if>>
<<if $wife.relationship >= 25>>
<br>
<<if $money >= 90>>
<<link "Take her lingerie shopping in town. ($90)" "Wife Date Lingerie">>
<<dateStart "shop" 90 false>>
<</link>>
<<else>>
//Lingerie shopping in town ($90), but you're short.//
<</if>>
<</if>>
<br><br>
<<link "Maybe another night." $return>><</link>><h2>Out with $wife.name</h2>
/* Quality roll, same formula as the other dates. */
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 4) + ($fitnessTier * 3)>>
<<if _score >= 85>>
<<set $wife.dateQuality = "great">>
<<elseif _score >= 45>>
<<set $wife.dateQuality = "good">>
<<else>>
<<set $wife.dateQuality = "flat">>
<</if>>
<<set _gain = 3>>
<<switch $wife.dateQuality>>
<<case "flat">>
<<set $wife.relationship += 1>>
<<case "good">>
<<set $wife.relationship += _gain>>
<<moodShift 1>>
<<case "great">>
<<set $wife.relationship += _gain + 1>>
<<set $wife.mood = 3>>
<</switch>>
<div class="lingerie-row">
<img src="images/dates/date_shop1.jpeg">
<img src="images/dates/date_shop2.jpeg">
<img src="images/dates/date_shop3.jpeg">
</div>
<br>
<<switch $wife.dateQuality>>
<<case "flat">>
<<set _lines = [
"The shop is brighter and pricier than either of you expected, and for the first few minutes she's self-conscious about being in there at all, holding sets up against herself and pulling faces. But she warms to it, ducking behind the curtain and calling out for your verdict on each one. You like all three and tell her so, and she rolls her eyes at you but she's pleased. She picks the one she keeps coming back to, you pay, and you grab a coffee on the walk home. //\"This was a good idea,\"// she admits, like it costs her something to say.",
"She's a little stiff about it at first, muttering that you're both going to walk out of here broke. Still, she tries on the three she likes and steps out for each, asking what you think with her arms half-crossed. You tell her honestly that they all work, and a bit of the wariness goes out of her. You buy her favorite and split a coffee after, and on the bus home she's quiet but her shoulder stays against yours."
]>>
<<case "good">>
<<set _lines = [
"She takes to it faster than you'd have guessed, disappearing behind the curtain and reappearing in each new set with a little turn in the mirror, asking //\"this one, or the other one?\"// and not really waiting for your answer. You tell her, honestly, that you can't choose, and she calls you useless and means the opposite. She settles on the one she likes best, you pay without flinching at the price, and you split a coffee on the way back with her thigh warm against yours in the window seat.",
"It's easy in a way these afternoons usually aren't. She models each set with a running commentary, narrating her own fashion show, and catches you watching her in the fitting-room mirror more than once. //\"Eyes up here,\"// she says, not meaning it. She picks her favorite, you buy it, and the coffee afterward turns into a long, unhurried sit where neither of you is in a rush to get home."
]>>
<<case "great">>
<<set _lines = [
"It turns into the best afternoon the two of you have had in longer than you can remember. She models each set with a showmanship she'd forgotten she had, posing in the mirror, watching your face in the glass and plainly enjoying what she finds there. //\"You're enjoying this far too much,\"// she says, delighted. She can't choose, so you tell her to get the one that makes her feel the way she looks right now. She does. The coffee after stretches into an hour of the old, easy flirting you thought you'd both used up years ago.",
"She lights up the moment she realizes you actually mean it, that this is the whole date and not a chore on the way to something else. She tries on far more than three, parading each one out for you, laughing, twirling, biting back a grin every time she catches your expression. //\"Keep looking at me like that and we're not making it home,\"// she murmurs by the mirror. She picks the one that did exactly that to you, you pay gladly, and the walk home is slow and close and full of plans neither of you says out loud."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<switch $wife.dateQuality>>
<<case "flat">>
<span class="warning">A bit awkward in places, but she's glad you did it.</span>
<<case "good">>
<span class="good">A fun afternoon, and she's grateful for the gesture.</span>
<<case "great">>
<span class="good">She hasn't had this much fun with you in years, and she's still glowing on the way home.</span>
<</switch>>
<br><br>
/* Schedule the flirty selfie a few days out. */
<<set $wife.lingerieSelfieDay = $gameDay + random(2, 4)>>
/* She heads to the bedroom when you get back */
<<set $wife.location = "bedroom">>
<<if $wife.dateQuality == "great" and not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Pull her close before the night ends.">>
<<set $wife.intimacyToday = true>>
<<set $return = "Bedroom">>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Head home and call it a night." "Bedroom">><</link>><h2>Out with $wife.name</h2>
/* Quality roll. Tune the weights here. */
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 4) + ($fitnessTier * 3)>>
<<if _score >= 85>>
<<set $wife.dateQuality = "great">>
<<elseif _score >= 45>>
<<set $wife.dateQuality = "good">>
<<else>>
<<set $wife.dateQuality = "flat">>
<</if>>
/* Relationship gain per type */
<<switch $wife.dateType>>
<<case "picnic">> <<set _gain = 2>>
<<case "bar">> <<set _gain = 3>>
<<case "cinema">> <<set _gain = 3>>
<<case "restaurant">><<set _gain = 4>>
<</switch>>
/* Apply outcome */
<<switch $wife.dateQuality>>
<<case "flat">>
<<set $wife.relationship += 1>>
<<case "good">>
<<set $wife.relationship += _gain>>
<<moodShift 1>>
<<case "great">>
<<set $wife.relationship += _gain + 1>>
<<set $wife.mood = 3>>
<</switch>>
/* Date image, one per location */
<div class="intro-image wide">
<img @src="'images/dates/date_' + $wife.dateType + '.jpeg'" width="100%">
</div>
<br>
/* Scene text */
<<switch $wife.dateType>>
<<case "picnic">>
<<switch $wife.dateQuality>>
<<case "flat">>
The wind comes off the water colder than it looked from the flat, and the cheap wine never quite warms either of you. She keeps her jacket zipped to the chin and answers in short, pleasant sentences, and after a while you pack the blanket up early. On the walk home she takes your arm anyway. It counts for something. Not much, but something.
<<case "good">>
You find a dry stretch of bank where the lamps give out and the water goes gold for a few minutes, as the sun sets. The wine is cheap and does its job. She tells a story about one of the girls at the restaurant, doing all the voices, and somewhere in it she leans her shoulder against yours and leaves it there.
<<case "great">>
The evening turns soft in a way you couldn't have bought at four times the price. She kicks her shoes off in the grass, drinks from the bottle, laughs at the heron on the far bank standing there like an unpaid security guard. For an hour the bank of the canal is your whole world and the flat isn't waiting. She walks home pressed against your side, unhurried, and doesn't let go of your arm at the door.
<</switch>>
<<case "bar">>
<<switch $wife.dateQuality>>
<<case "flat">>
The Anchor is dead in the wrong way, three sad drunken regulars and a jukebox nobody's fed. The dartboard's lighting is broken and she beats you twice without seeming to enjoy it. The drinks land, at least. She softens a little by the second one, but the night never quite finds its footing.
<<case "good">>
Two drinks in, she gets competitive, and it's the best thing that's happened to you all week. She talks trash like she used to, lining up her throw with one eye shut, and when she wins she does a small contained victory shimmy she'd deny under oath. She's flushed and loose on the walk home, her hand finding yours without ceremony.
<<case "great">>
She destroys you at darts. Properly, three games straight, and somewhere in the middle of it the years thin out and you're just a guy in a bar watching the best thing in the room run the table. The regulars start backing her. She curtsies to applause. On the way home she's warm and tipsy against you, still narrating her own highlights, and you'd pay the bill twice again right now just for the curtsy.
<</switch>>
<<case "cinema">>
<<switch $wife.dateQuality>>
<<case "flat">>
The film is bad in the boring way rather than the fun way, and the couple behind you conduct their entire relationship at speaking volume. She checks the time twice. On the bus home you both try to build a conversation out of it and the pieces don't quite fit. Still, it was an evening out. The flat looks slightly smaller when you get back, which is to say slightly better.
<<case "good">>
The film is decent and the dark does what the dark does. Somewhere in the second act her head finds your shoulder and stays, and you stop following the plot entirely. Afterward she relitigates the ending all the way to the bus stop, gesturing with the empty popcorn bag, and you take the losing side just to keep her going.
<<case "great">>
You laugh at the same wrong moments, the two of you setting each other off in the dark like teenagers until someone shushes you, which makes it worse. She quotes the worst line in the foyer, doing the actor's face, and you have to stop walking to laugh. The whole bus ride home is the two of you finishing each other's stories. You'd forgotten you were good at this. So had she, by the look of her.
<</switch>>
<<case "restaurant">>
<<switch $wife.dateQuality>>
<<case "flat">>
The room is lovely and the two of you are stiff in it, like guests at a couple of strangers' anniversary. The talk keeps drifting to logistics, the boy, the week, and twice you catch yourself doing the math on the menu and once she catches you doing it. The food is good. The bill lands like a verdict. She thanks you on the way out, and means it, mostly.
<<case "good">>
It takes a glass of wine for both of you to remember how to sit in a place like this, and then it comes back. Candlelight, food neither of you had to cook, no dishes waiting. She talks about something that isn't money or the boy for the first time in months, an idea she's been carrying around, and you listen the way you used to. The walk to the bus is slow on purpose.
<<case "great">>
She came downstairs in the green dress and you forgot what you were going to say, and she clocked it, and that set the tone for the night. Across the candlelight, two glasses in, telling a story with her hands, she is unmistakably the woman from twelve years ago, and from the way she's looking at you, you're apparently visible in there somewhere too. The bill arrives and for once you don't even read it. Worth it. All of it.
<</switch>>
<</switch>>
<br><br>
<<switch $wife.dateQuality>>
<<case "flat">>
<span class="warning">The night never quite caught, but it wasn't nothing.</span>
<<case "good">>
<span class="good">A good night out. It mattered.</span>
<<case "great">>
<span class="good">A night like the old days. She hasn't looked at you like this in years.</span>
<</switch>>
<br><br>
/* She heads to the bedroom when you get back */
<<set $wife.location = "bedroom">>
<<if $wife.dateQuality == "great" and not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Pull her close before the night ends.">>
<<set $wife.intimacyToday = true>>
<<set $return = "Bedroom">>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Head home and call it a night." "Bedroom">><</link>><h2>Morning</h2>
You wake to the overhead light already on and the sound of her breathing hard, and you know before your eyes are open that she knows.
<br><br>
$wife.name is standing over your side of the bed. She has something balled in her fist, and she throws it at you and misses. You don't see what it was, but can only guess. Condom wrapper? Another girl's phone number? Who knows...
<br>
<div class="char-scene">
<img @src="either('images/characters/w/w_angry1.jpeg', 'images/characters/w/w_angry2.jpeg')" class="char-img">
</div>
<<speech "Wife" $wife.name>>
Don't. Don't you dare lie there and pretend you're still half asleep. I was doing your laundry. Yours. And I found that shit in your pocket.
<</speech>>
<<speech "You" $name>>
Wait. Wait, I can explain, just let me...
<</speech>>
<<speech "Wife" $wife.name>>
Explain? Go on then. I would fucking love to hear which version of this you think I'm stupid enough to swallow.
<</speech>>
<br>
She's louder now, past caring who hears it through the walls.
<br><br>
<<speech "Wife" $wife.name>>
I gave up everything for you. The auditions, the callbacks, the one thing that was ever mine, I let all of it go to trail around after you while you burned through our savings and our house and called it a vision. And I stayed. After every bit of it, I stayed, because I kept telling myself the man I married was still in there somewhere under the gut and the self-pity.
<</speech>>
<<speech "Wife" $wife.name>>
I cook, I clean, I raise our son on my own most days, I cover the rent you can't, and this is what you do with what's left of us? You absolute piece of shit. Look at me. Was she worth it? Was any of this shit worth it?
<</speech>>
<br>
You open your mouth. Nothing in it is going to help, and some animal part of you knows enough to keep it shut.
<br><br>
<<speech "Wife" $wife.name>>
No. I'm done talking to you. I have to get our son ready, because one of us still has to act like a person in this house.
<</speech>>
<br>
She turns and walks out, and you hear her voice change in the hall, going soft and ordinary for the boy in a way it will not be for you for a long while. You're left in the bed with it sitting on your chest and the day waiting outside the door as if nothing happened.
<br><br>
<<if $wife.relationship < -25>>
<span class="bad">You're not sure there's a way back from this one.</span>
<<else>>
<span class="bad">$wife.name found out. Your relationship has taken a serious hit.</span>
<</if>>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.discoveryToday = false>>
<<set $wife.discoveryResult = 0>>
<</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $arousal = Math.max($arousal - 3, 0)>>
<<if $wife.obligation>>
<<set $wife.dutyCount += 1>>
<<if $wife.dutyCount % 3 == 0>>
<<set $wife.dutyScold = true>>
<</if>>
<<moodShift -1>>
<<else>>
<<set $wife.relationship += 1>>
<</if>>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_hj" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 8; _i++>>
<<set _gifs.push("w_hj" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 35 65>>
<<if $wife.obligation>>
<<set _lines = [
"She wraps her fingers around your cock and strokes with the same flat, mechanical pace, skin sliding over skin in a rhythm that never changes. Her thumb never brushes the head. Her gaze stays fixed on the wall behind you. When you spurt she already has tissues ready, wiping each finger one by one before the last pulse has finished.",
"Her loose grip pumps your shaft just enough to finish the job, wrist turning in short, economical strokes. Twice she tilts her head toward the hallway, checking for footsteps. The moment your cum coats her palm she stops, wipes it on a towel, and folds her hands, waiting for you to stop breathing hard.",
"She closes her fist around your cock the way she would grip a stuck lid, squeezing and twisting with brisk efficiency. No extra pressure, no teasing. You watch her eyes and see only blank concentration. When the last spurt lands she heads straight to the sink, scrubbing her fingers under the hot water."
]>>
<<else>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"$wife.name grips your cock with quick, mechanical strokes, her palm sliding up and down the shaft in short, efficient pumps. Her eyes stay fixed on the far wall, bored and distant, like she’s just finishing a chore. Cum spurts over her fingers and she wipes it off on a tissue without looking at you, then turns away without a word.",
"Her fingers wrap around your cock with brisk, purposeful strokes, sliding along the length in steady pumps driven by obligation rather than heat. $wife.name brings you to the edge efficiently, already glancing away as your cum spills over her hand, and reaches for a tissue first to wipe it clean.",
"$wife.name's fingers wrap close around your shaft in the same brisk, mechanical rhythm, pumping steadily through the motions without any spark of interest. Her eyes stay fixed on nothing in particular, thoughts clearly drifting far from the act as she works you to completion. When your cum sprays over her hand she finishes the job without pause, then sits back on the edge of the bed, silent and unmoved, the space between you exactly as it was before."
]>>
<<case 1>>
<<set _lines = [
"She settles against you and takes her time, in no real hurry. There is a warmth to it that has been missing for a while. Her fingers wrap around your cock with a steady, unhurried grip. She strokes you slowly, deliberately, her thumb brushing over the head on each pass. Her body leans into your side, her breath warm against his neck as she works you without rushing. When your cum spills over her fingers she keeps her hand on him a moment longer, then simply rests it there, the quiet between you comfortable instead of empty.",
"She leans in closer than she needs to, her hand unhurried, almost fond. It isn't the old fire, not quite, but there's a give to her tonight. Her palm slides along your shaft in smooth, measured strokes. She presses her cheek to your shoulder, her free hand resting lightly on his thigh. Each movement feels present, attentive, her fingers adjusting to the way his body responds. When you finish she keeps her hand wrapped around him, wiping nothing away yet, just staying close with her body fitted against yours.",
"There's an ease to her hand you haven't felt in a long time, a willingness in it. She watches your face as much as her own work. Her fingers move with a relaxed rhythm, sliding up and down your cock while her eyes stay on your expression. She gives a small, quiet sound when you twitch in her grip, her strokes staying even and sure. When your cum coats her hand she doesn't pull back right away. Instead she leans her head on your shoulder, letting the moment stretch before she finally shifts to clean up."
]>>
<<case 2>>
<<set _lines = [
"Her fingers close around your cock in a firm, steady grip. She strokes you with long, measured pulls, her eyes locked on your face the whole time. Every twitch and shift in your body draws a small, satisfied smile from her. She adjusts her pressure and speed based on what she sees, clearly savoring how you respond. When you cum she keeps stroking through it, then leans in and presses her mouth to yours in a slow, deep kiss that lingers.",
"Her hand moves in smooth, unhurried strokes along your shaft, her thumb circling the head each time she reaches the top. She watches your expression with open amusement, her lips curved in that knowing half-smile. She slows down when she feels you getting close, drawing the moment out until you can't hold back. Your cum spills over her fingers and she grins wider, wiping nothing away yet. Instead she tugs you forward by the back of your neck and kisses you hard, her tongue sliding against yours.",
"Her fingers work your cock with sure, confident rhythm, twisting slightly on each upstroke. She glances between your face and her hand, clearly turned on by how hard you are for her. When you start to cum she doesn't stop, milking every pulse with focused attention. Once you're finished she climbs closer, pressing her body against yours and kissing you deep and slow, her mouth moving against yours like she has all the time in the world."
]>>
<</switch>>
<</if>>
<<= _lines.random()>>
<br><br>
<<link "Continue.">>
<<set $wife.obligation = false>>
<<goto $return>>
<</link>><h2>With $wife.name</h2>
<<wifeReact>>
''What do you do?''
<br>
/* TALK */
<<if !$wife.talkedToday>>
<<link "Talk to her.">>
<<set $wife.talkedToday = true>>
<<moodShift 1>>
<<set $wife.talkTopic = ["kid", "past", "plans", "cheer", "castings", "sofa", "shower", "shape", "restaurant", "boxing", "startup", "affection", "coffee", "reality", "canal", "series", "documentary", "takeout", "neighbor", "dream", "lottery", "music"].random()>>
<<set $wife.lastInteraction = "talked">>
<<goto "Wife Interact">>
<</link>>
<<else>>
//You've already had a moment to chat with her today.//
<</if>>
<br>
/* AFFECTION */
<<if not $wife.affectionToday>>
<<link "Hold her for a moment.">>
<<set $wife.affectionToday = true>>
<<if $wife.mood >= 0>>
<<moodShift 1>>
<<careCredit>>
<<goto "Wife Affection">>
<<else>>
<<set $wife.lastInteraction = "affection_refuse">>
<<goto "Wife Interact">>
<</if>>
<</link>>
<<else>>
//You've already reached for her once today.//
<</if>>
<br>
/* WINE */
<<if $items.wine > 0 and not $wife.wineToday and $gameDay - $wife.lastWineDay >= 3 and $time >= 5 and $wife.relationship >= 5 and $wife.mood >= 0>>
<<link "Open a bottle of wine with her." "Wife Wine">><</link>>
<br>
<<elseif $items.wine > 0 and $wife.wineToday>>
//You've already shared a bottle with her tonight.//
<br>
<<elseif $items.wine > 0 and $gameDay - $wife.lastWineDay < 3 and $time >= 5 and $wife.relationship >= 5 and $wife.mood >= 0>>
//You shared a bottle with her not long ago.//
<br>
<</if>>
/* DATE */
<<if $time == 5 or $time == 6>>
<<if $wife.dateToday>>
/* Already out tonight - nothing shown */
<<elseif $gameDay - $wife.lastDateDay < 3>>
//You took her out recently. The sitter needs notice, and so does she.//
<br>
<<elseif $wife.mood <= -1>>
//She's in no mood to be charmed out the door tonight.//
<br>
<<elseif $energy < 1>>
//You're too worn out to make an evening of it.//
<br>
<<else>>
<<link "Ask her on a date for the evening." "Wife Date">><</link>>
<br>
<</if>>
<</if>>
/* MAKE A MOVE */
<<if !$wife.intimacyToday>>
<<intimacyReady>>
<<if _ready>>
<<link "Make a move on her.">>
<<if $gameDay < $intimacyUnlockDay>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastInteraction = "advance_tooSoon">>
<<goto "Wife Interact">>
<<elseif $wife.cycleOff and not ($wife.relationship >= 25 and $wife.mood >= 0)>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastInteraction = "advance_period">>
<<goto "Wife Interact">>
<<elseif $wife.relationship >= 25 and $wife.mood >= 1>>
<<set $wife.intimacyToday = true>>
<<set $wife.obligation = false>>
<<goto "Wife Physical">>
<<elseif $wife.relationship >= 10 and $wife.mood >= 0>>
<<set $wife.intimacyToday = true>>
<<set $wife.obligation = true>>
<<goto "Wife Physical">>
<<elseif $wife.relationship >= 10>>
<<set $wife.lastInteraction = "advance_cold">>
<<goto "Wife Interact">>
<<elseif $wife.relationship >= 0>>
<<set $wife.lastInteraction = "advance_notyet">>
<<goto "Wife Interact">>
<<else>>
<<set $wife.intimacyToday = true>>
<<moodShift -1>>
<<set $wife.lastInteraction = "advance_fail">>
<<goto "Wife Interact">>
<</if>>
<</link>>
<<else>>
//Too soon. She's not going to want it again this quick.//
<</if>>
<<else>>
//You've reached for her once today. That's enough.//
<</if>>
<br><br>
<<link "Step away." $return>><</link>><h2>With $wife.name</h2>
/* Consume the event */
<<set $wife.lingerieNightDay = 0>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $wife.relationship += 2>>
<<moodShift 1>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
/* STILL: her on the bed in the set */
<<set _stills = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _stills.push("w_lingNight" + _i + ".jpeg")>>
<</for>>
<div class="intro-image">
<img @src="'images/characters/w/' + _stills.random()" width="100%">
</div>
<br>
/* OPENING BEAT */
<<set _open = [
"You push the bedroom door open and stop. The lamp is on low, and $wife.name is on the bed in the set you bought her, watching you take it in with a look that says she has been planning this since the fitting room.",
"The bedroom is warmer than you left it, one lamp lit, and $wife.name is waiting on the covers in the lingerie from that afternoon in town. She doesn't say anything. She doesn't need to."
]>>
<<= _open.random()>>
<br><br>
<<set _l = [
"I was just trying out the new set you bought me, and it crossed my mind that I never really thanked you properly.",
"I just love this new set of lingerie you got me. You like it too? Does it turn you on, $name?",
"I thought you deserved a little surprise, when you treated me so good with this new set of lingerie."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<br>
She takes your hand and pulls you towards the bed and sits you down on the edge. After slowly getting down on her knees in front of you, she opens your pants, finds your cock and takes you between her lips.
<br>
/* GIF pool for the act */
<<set _gifs = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _gifs.push("w_bjLing" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
/* BJ Scene */
<<set _scene = [
"$wife.name's warm mouth slides down your shaft, tongue swirling around the head. She sucks harder, bobbing steadily while her hand strokes the base. You groan as her lips tighten, cheeks hollowing with each pull. Her pace quickens until your hips buck. With a final deep suck she takes you to the back of her throat. Thick ropes of cum pulse into her mouth. She swallows every drop, throat working visibly as she drains you dry.",
"$wife.name's tongue laps the underside while she sinks lower, lips stretched tight. She works you with wet, noisy sucks, saliva dripping down your balls. Fingers cup and squeeze as she speeds up. Your cock throbs and you flood her mouth. She gulps it all down without spilling a drop, swallowing until you're spent.",
"$wife.name seals her lips around you and sucks firmly, head moving in steady rhythm. Her hand twists at the base while her tongue presses against the sensitive spot. You can't hold back. Hot cum shoots in her mouth. She swallows everything, throat rippling until nothing remains."
]>>
<<= _scene.random()>>
<br><br>
/* AFTERGLOW */
<<set _after = [
"As you lie back on the bed catching your breath, she crawls up beside you and stays draped against you, one strap slipped off her shoulder, entirely pleased with herself. Money well spent, she murmurs, and you are in no position to argue.",
"She settles into the crook of your arm as you lie down on the bed. Seems like the trip into town was worth it after all, she mumbles."
]>>
<<= _after.random()>>
<br><br>
<<link "Sleep." "Sleep">><</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<if $wife.obligation>>
<<set $wife.dutyCount += 1>>
<<if $wife.dutyCount % 3 == 0>>
<<set $wife.dutyScold = true>>
<</if>>
<<moodShift -1>>
<<else>>
<<set $wife.relationship += 1>>
<</if>>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_bj" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 9; _i++>>
<<set _gifs.push("w_bj" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 55 80>>
<<if $wife.obligation>>
<<set _lines = [
"She drops to her knees without a word, one palm flat on your thigh, and starts sucking with a steady, mechanical rhythm that never speeds up or slows down. Her tongue stays flat, her eyes stay shut, and you can hear her counting each stroke under her breath. When you spurt she swallows once, twice, then wipes her mouth on the back of her hand and asks if you know where she left her phone.",
"She takes your cock between her lips the way she loads the dishwasher, efficient and blank. No teasing, no extra pressure, just the same wet slide until you finish. The moment the first spurt hits her tongue she pulls off, presses her wrist to her mouth, and walks straight to the bathroom without looking back.",
"Her mouth is hot but her mind is clearly elsewhere. Halfway through she shifts her knees on the rug and you hear a soft sigh around your shaft, the sound of someone adjusting for a longer chore. She keeps sucking until you finish, then stands, smooths her clothes, and the room settles back into silence."
]>>
<<else>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"She drops to her knees with a quiet sigh, lips parting just enough to take your cock inside. Her head moves in short, mechanical strokes, tongue barely active as she works you steadily. You throb and spill down her throat in thick pulses. She swallows once, pulls off fast, wipes her mouth with the back of her hand, and stands without another glance.",
"She wraps her fingers around your shaft and pumps in steady rhythm, mouth sealed tight around the head. Her cheeks stay hollow as she sucks with patient efficiency. You pulse between her lips and she swallows every drop without pause. Then she straightens, reaches for her glass, and sips like nothing happened.",
"Her mouth closes around you with quiet duty, tongue flat and still. She sucks in slow, even pulls until your cum floods her tongue in heavy spurts. She swallows once, rises without a word, and turns away like the act never happened."
]>>
<<case 1>>
<<set _lines = [
"She kneels willingly, tongue swirling slow over your cockhead before she takes you deeper. Her hand strokes the base while her lips glide up and down. You cum across her tongue in warm bursts and she holds it there, eyes meeting yours as she swallows with a soft hum.",
"She strokes your length with both hands, fingers sliding over every inch while her lips glide up and down the shaft. When you finish across her breasts in thick ropes she rubs the warm streaks into her skin, smiling faintly as she meets your gaze.",
"Her head moves in smooth rhythm, cheeks hollowing as she sucks harder. You groan and paint her face with heavy spurts; she stays still, letting it drip down her chin while her eyes linger on you with quiet satisfaction."
]>>
<<case 2>>
<<set _lines = [
"She moans around your cock, sucking hard and fast, tongue flicking the underside with every stroke. You explode in her mouth and she gulps it down greedily, licking her lips clean with a wide grin before kissing the tip.",
"She takes you to the back of her throat, bobbing eagerly while her hand twists at the base. Your load splashes across her cheeks and she laughs, wiping it with her fingers then licking them clean one by one.",
"She rides her mouth up and down your length with hungry strokes, eyes locked on yours the whole time. You cum on her tits and she pushes them together, smearing your cum over her nipples before leaning in to suck the last drops from your tip."
]>>
<</switch>>
<</if>>
<<= _lines.random()>>
<br><br>
<<if $wife.relationship >= 65 and $gameDay >= $intimacyUnlockDay and not $phone.intimacyPicToday>>
<<link "Reach for your phone. She lets you snap a memory.">>
<<set $phone.intimacyPicToday = true>>
<<set _bjPics = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _bjPics.push("w_phone_bj" + _i + ".jpeg")>>
<</for>>
<<set _img = "images/characters/w/" + _bjPics.random()>>
<<set _cap = "You took this on day " + $gameDay + ".">>
<<galleryAdd _img _cap>>
<<goto $return>>
<</link>>
<br>
<</if>>
<<link "Continue.">>
<<set $wife.obligation = false>>
<<goto $return>>
<</link>><h2>With $wife.name</h2>
<<set $sceneLoc = $wife.location>>
<<switch $wife.location>>
<<case "bedroom">> <<set _bjRel = 40>><<set _sexRel = 55>><<set _sexHere = true>>
<<case "bathroom">> <<set _bjRel = 40>><<set _sexRel = 65>><<set _sexHere = true>>
<<case "livingroom">> <<set _bjRel = 40>><<set _sexRel = 65>><<set _sexHere = true>>
<<case "kitchen">> <<set _bjRel = 40>><<set _sexRel = 65>><<set _sexHere = true>>
<</switch>>
<<set _roomMaxTier = _sexHere ? 3 : 2>>
<<if $wife.obligation>>
/* Obligation route: she says yes because no is a conversation. */
<<set _maxTier = $wife.relationship >= 40 ? 2 : 1>>
<<else>>
<<set _sexMoodReq = 2>>
<<if $wife.tipsy>>
<<set _bjRel = Math.max(10, _bjRel - 8)>>
<<set _sexRel = Math.max(50, _sexRel - 8)>>
<<set _sexMoodReq = 1>>
<</if>>
<<set _maxTier = 1>>
<<if $wife.mood >= 1 and $wife.relationship >= _bjRel>>
<<set _maxTier = 2>>
<</if>>
<<if _sexHere and $wife.mood >= _sexMoodReq and $wife.relationship >= _sexRel>>
<<set _maxTier = 3>>
<</if>>
<<if $wife.cycleOff and _maxTier > 2>>
<<set _maxTier = 2>>
<</if>>
<</if>>
<<if $wife.obligation>>
<<set _open = [
"She looks at your hand on her, then at the clock, and you can see her doing the math. How long this takes against how long the conversation would take if she said no. She sighs through her nose and doesn't move away.",
"There's a pause where she could say something. She doesn't. She just shifts to give you the room, her face carefully neutral, the way she is with people at work she doesn't especially like.",
"She lets out a small breath and sets down what she was holding. Not a yes exactly. More that she's decided not to make it a thing tonight."
]>>
<<= _open.random()>>
<<elseif $wife.mood >= 2>>
She catches your hand, eyes curious, and waits to see what you have in mind.
<<elseif $wife.mood >= 1>>
She leans into the touch, a small smile pulling at the corner of her mouth.
<<else>>
She doesn't pull away. She waits.
<</if>>
<<if $wife.cycleOff and _sexHere and $wife.relationship >= _sexRel and $wife.mood >= _sexMoodReq>>
<br>//She murmurs that she's on her period, so you'll have to wait a few days to go all the way.//
<<elseif $wife.cycleOff>>
<br>//She's on her period and a bit tender, but she doesn't push you away.//
<</if>>
<br><br>
''What do you do?''
<br>
<<switch $wife.location>>
<<case "bedroom">>
<<link "Take her hand under the covers.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Ask her to use her mouth.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Make love to her.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<<case "bathroom">>
<<link "Pull her hand to your cock.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Put your hand on her shoulder and ask her down.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Lift her against the wall.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<<case "livingroom">>
<<link "Slip her hand under the blanket.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Coax her head down to your lap.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Pull her down onto the couch with you.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<<case "kitchen">>
<<link "Press up behind her and take her hand back.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Back her against the counter and ask her down.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<if $fitnessTier < 3 and $energy < 1>>
//You're too worn out to see it through.//
<<else>>
<<link "Bend her over the counter.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<</if>>
<br>
<</if>>
<</switch>>
<br>
<<link "Change your mind.">>
<<set $wife.obligation = false>>
<<goto $return>>
<</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<sexEnergy 1>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<set $wife.relationship += 1>>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_h" + _i + ".gif")>>
<</for>>
<<elseif $sceneLoc == "kitchen">>
<<set _gifs = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _gifs.push("w_kitchen_h" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 16; _i++>>
<<set _gifs.push("w_h" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 70 88>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"You push inside her pussy while she lies back, barely moving. She keeps her eyes on the ceiling as you thrust slow and steady, her legs spread just enough to let it happen. You cum deep in her cunt and she stays still, quiet, like she is only letting you use her body tonight.",
"She rolls onto her back when you climb over her. You fuck her missionary style, sliding in and out while she stays mostly passive. Her breathing stays even. You pull out at the end and shoot thick ropes of cum across her stomach and tits. She wipes it off without a word.",
"You take her from behind on the bed, gripping her hips as you thrust into her pussy. She stays on all fours but does not push back. You finish inside her, filling her up, and she simply lies down afterward without looking at you."
]>>
<<case 1>>
<<set _lines = [
"She gets on top and rides you slowly, lowering herself onto your cock until you are buried in her. You both move together, finding the rhythm. You cum inside her and she stays seated on your lap, keeping you deep while she catches her breath.",
"You fuck her in missionary, her legs wrapped around your waist. She meets each thrust, her hands on your back. You pull out and cum across her pussy and lower belly. She reaches down to feel it, then pulls you close again.",
"She bends over the edge of the bed and you take her standing from behind. Your cock slides in and out of her wet pussy while she pushes back a little. You cum inside her and she stays bent over, letting it drip down her thighs as she rests."
]>>
<<case 2>>
<<set _lines = [
"She climbs on top and rides you hard, bouncing on your cock while you grab her ass. She grinds down until you explode deep inside her pussy. She keeps moving through your orgasm, milking every drop before collapsing on your chest.",
"You fuck her doggy style, pounding into her from behind. She reaches back to spread herself wider and begs for it harder. You pull out and cover her ass and lower back with cum. She looks over her shoulder, smiling as it runs down her skin.",
"She lies on her back with legs wide and pulls you into her. You thrust deep while she moans and claws at your shoulders. You cum inside her, filling her completely, and she wraps her arms and legs around you, holding you tight so you stay buried in her pussy."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<link "Continue." $return>><</link>><h2>Morning</h2>
She's waiting for you when you wake, sitting on the edge of the bed, already dressed. She doesn't look over when you stir. She's been rehearsing this, you can tell, and she means to get through it without losing the thread.
<div class="char-scene">
<img @src="either('images/characters/w/w_angry1.jpeg', 'images/characters/w/w_angry2.jpeg')" class="char-img">
</div>
<<speech "Wife" $wife.name>>
Sit up. Don't talk, just listen, because I've said this to you in my head a hundred times and I need to say it once out loud.
<</speech>>
<<speech "Wife" $wife.name>>
I am almost done. Not angry-done. Done-done. I gave up the one thing that was ever mine to follow you, and I have spent years telling myself it would turn back into something. I don't tell myself that anymore.
<</speech>>
<<speech "Wife" $wife.name>>
So this is the last of it. The last of my patience, the last of the benefit of the doubt. Give me a reason. A real one. Because if this is still what it is a while from now, I'm taking our son and I'm going, and you will not talk me out of it.
<</speech>>
<br>
She holds your eye a moment longer, then gets up and goes to get your son ready, and her voice through the wall is soft and ordinary for him, the way it used to be for you.
<br><br>
<span class="bad">$wife.name has reached the end of her patience. Let things fall further and she will leave.</span>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.ultimatumToday = false>>
<</link>><h2>With $wife.name</h2>
<<set $items.wine -= 1>>
<<set $wife.wineToday = true>>
<<set $wife.lastWineDay = $gameDay>>
<<set $wife.tipsy = true>>
<<moodShift 1 1>>
<div class="intro-image">
<img @src="either('images/characters/w/w_wine1.jpeg', 'images/characters/w/w_wine2.jpeg', 'images/characters/w/w_wine3.jpeg')" width="100%">
</div>
<<if $wife.relationship >= 40>>
You pour two glasses and she's smiling before you've even handed hers over. For an hour the years seem to thin out. She tells a story you've heard a dozen times and you let her, because she tells it well and because watching her tell it is the whole point. By the bottom of the bottle she's leaning into you, warm and unhurried, in no rush to be anywhere but here.
<<elseif $wife.relationship >= 25>>
You pour two glasses and she shifts to make room, tucking her feet up under her. The talk comes easy tonight, looping back through old jokes and half-finished stories. Somewhere in the second glass her hand ends up on your knee and stays there, and she looks at you the way she used to, before there was always something she was bracing for.
<<else>>
You pour two glasses and sit down beside her. She takes hers with a small, surprised look, like she'd half forgotten this was a thing the two of you used to do. The first glass goes down quiet. By the second she's turned toward you instead of the room, something in her shoulders finally letting go, and she laughs at something you say, properly, like she's a little annoyed at herself for it.
<</if>>
<br><br>
<<if not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Make a move on her.">>
<<set $wife.intimacyToday = true>>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Let the evening be what it is." $return>><</link>><h2>Morning</h2>
She's up before you, and she's waiting. Not pacing, not loud. Just sitting at the edge of the bed with her arms crossed, looking at you in a way that's worse than shouting.
<div class="char-scene">
<img src="images/characters/w/w_worry1.jpeg" class="char-img">
</div>
<<speech "Wife" $wife.name>>
You came in late again. I could smell it on you from across the room. And don't think I haven't seen the state of your hands.
<</speech>>
<<speech "You" $name>>
It's nothing. I'm handling it.
<</speech>>
<<speech "Wife" $wife.name>>
You think this is handling it? The drinking and whatever it is you're doing to end up looking like that. I've watched you go down a hole once already. I held this family together at the bottom of it. I cannot do it twice.
<</speech>>
<<speech "Wife" $wife.name>>
I'm not asking you to be a saint. I'm asking you not to throw yourself away in front of me and our son. Because he sees more than you think, and so do I.
<</speech>>
<br>
She holds your eye a moment longer, then gets up to start the boy's morning, leaving the weight of it sitting on you.
<br><br>
<span class="warning">$wife.name is worried about the way you're living and it's straining your relationship.</span>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.worryScoldToday = false>>
<<set $wife.worryResult = 0>>
<</link>><<widget "resetWifeFlags">>
<<set $wife.talkedToday = false>>
<<set $wife.intimacyToday = false>>
<<set $wife.lastInteraction = "">>
<<set $wife.spiedToday = false>>
<<set $wife.bathroomViewedToday = false>>
<<set $wife.talkTopic = "">>
<<set $wife.cookedToday = false>>
<<set $wife.tipsy = false>>
<<set $wife.wineToday = false>>
<<set $wife.dateToday = false>>
<<set $wife.arousalNoticedToday = false>>
<<set $wife.yogaViewedToday = false>>
<<set $wife.outingResolved = false>>
<<set $wife.outForDay = false>>
<<set $wife.lazyMorningToday = false>>
<<set $wife.affectionToday = false>>
<<set $wife.wardrobeSeen = false>>
<<set $wife.choreToday = false>>
<<set $wife.careToday = false>>
<<set $wife.obligation = false>>
<</widget>><<widget "resetDailyState">>
/* Energy / player one-shots */
<<set $energy = $energyMax>>
<<set $ventedToday = false>>
<<set $foughtToday = false>>
/* Job flags */
<<set $job.attendedToday = false>>
<<set $job.missedToday = false>>
<<set $job.distractedToday = false>>
<<set $job.wfhToday = false>>
/* Phone flags */
<<set $phone.wifeTextedToday = false>>
<<set $phone.nudeAskedToday = false>>
<<set $phone.intimacyPicToday = false>>
<<set $phone.friendTextedToday = false>>
/* Assistant flags */
<<resetAssistantFlags>>
/* Lingerie selfie: fires a few days after the shopping date.
Waits a day if another wife photo is already pending. */
<<if $wife.lingerieSelfieDay > 0 and $gameDay >= $wife.lingerieSelfieDay and not $phone.wifeUnread>>
<<set _ling = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _ling.push("w_phone_ling" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _ling.random()>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifeMsgType = "lingerie">>
<<set $phone.wifeMsgText = [
"couldn't resist trying it on again 😘 thank you for this, you've got better taste than you let on 💕",
"feeling dangerously good in what you picked out for me 🔥 thought you should see what's waiting at home...",
"thanks for the shopping spree, you officially have an eye for this 😏 here's a little preview, don't get distracted 💋",
"so. worth. it. 😍 just gonna leave this right here and let you think about it all day 😈"
].random()>>
<<set $wife.lingerieSelfieDay = 0>>
<<set $wife.lingerieNightDay = $gameDay + random(3, 6)>>
<</if>>
/* Lingerie bedroom event expires if left unused too long */
<<if $wife.lingerieNightDay > 0 and $gameDay > $wife.lingerieNightDay + 10>>
<<set $wife.lingerieNightDay = 0>>
<</if>>
/* Wife-initiated nude at high relationship */
<<set _nudeOk = $wife.relationship >= 60 and $gameDay >= $intimacyUnlockDay and ($gameDay - $phone.lastNudeDay) >= $phone.nudeCooldown>>
<<if _nudeOk and not $phone.wifeUnread and random(1, 100) <= 20>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _nudes = _nudes.filter(f => f !== $phone.lastNudeImg)>>
<<set _pick = _nudes.random()>>
<<set $phone.lastNudeImg = _pick>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifePendingImg = _pick>>
<<set $phone.wifeMsgType = "nude">>
<<set $phone.wifeMsgText = [
"thinking about you. no reason. carry on 🙈",
"house is empty and I'm bored. somehow this is your fault 😏",
"don't open this at work. actually, do. I don't care 😈",
"just out of the shower and you crossed my mind 💋",
"no occasion. just wanted you to know what's waiting at home 🔥",
"I miss you. that's the polite version 😘",
"you've been good lately. consider this the review 😌"
].random()>>
<<set $phone.lastNudeDay = $gameDay>>
<</if>>
/* Friend ping: a stale Anchor invite is dropped before today's
roll; evergreen pings persist until replied. */
<<if $phone.friendPingTopic == "anchor">>
<<set $phone.friendPingTopic = "">>
<<set $phone.friendUnread = false>>
<</if>>
<<set _friendOk = ($gameDay - $phone.lastFriendPing) >= $phone.friendCooldown>>
<<if _friendOk and not $phone.friendUnread and random(1, 100) <= 40>>
<<set _pingPool = ["checkin", "memory", "ribbing", "lowkey"]>>
<<if $weekday == 5 or $weekday == 6>>
<<run _pingPool.push("anchor", "anchor")>>
<</if>>
<<set $phone.friendPingTopic = _pingPool.random()>>
<<set $phone.friendUnread = true>>
<<set $phone.lastFriendPing = $gameDay>>
<</if>>
/* Misc daily */
<<set $friend.drankToday = false>>
<<set $onsToday = false>>
<</widget>><h2>Project Choice Genre</h2>
An early fork. Before you build much further, you have to decide what kind of game this really is.
<br><br>
<<link "Aim broad. Vanilla sex and the everyman's fantasies. Something accessible, easy to fall into.">>
<<set $project.choices.genre = "broad">>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You commit to a broad, welcoming design. The kind of game a lot of people could enjoy.">>
<<goto "Computer">>
<</link>>
<br>
<<link "Go niche. We'll trawl dark the waters of human lust. Unapologetic and for people who know what they want.">>
<<set $project.choices.genre = "niche">>
<<set $project.supMult = 4>>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You lean into a niche. A smaller crowd, maybe, but one that'll pay extra attention.">>
<<goto "Computer">>
<</link>><h2>Project Choice Protagonist</h2>
The game needs someone at its center. Who does the player get to be?
<br><br>
<<link "An everyman. Ordinary, relatable, easy to project onto and easy to do everything you wish you could in real life.">>
<<set $project.choices.protagonist = "everyman">>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You write your lead as an everyman. Nothing flashy. Someone anyone could imagine being.">>
<<goto "Computer">>
<</link>>
<br>
<<link "A stylised fantasy lead from a magical realm. Larger than life, and with no limits to creative perversion.">>
<<set $project.choices.protagonist = "fantasy">>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You build a lead from the realms of fantasy. Can do anything you can imagine, and unashamed of it.">>
<<goto "Computer">>
<</link>><h2>Project Choice Feature</h2>
You've got room for one real signature system, the thing people will talk about. Where does the effort go?
<br><br>
<<link "Deep stat management. Systems, numbers, optimisation. All working towards collecting those precious sex scenes.">>
<<set $project.choices.feature = "stats">>
<<set _rush = random(4, 7)>>
<<set $project.supporters += _rush>>
<<set $project.weeklyIncome = $project.supporters * $project.supMult>>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You go deep on systems. A wave of " + _rush + " min-maxers finds the game and moves in. Your page now brings in $" + $project.weeklyIncome + " a week.">>
<<goto "Computer">>
<</link>>
<br>
<<link "Scene variety. More situations, more breadth, more to see.">>
<<set $project.choices.feature = "variety">>
<<set $project.supMult += 1>>
<<set $project.weeklyIncome = $project.supporters * $project.supMult>>
<<set $project.pendingChoice = "">>
<<set $pcMsg = "You pour it into breadth. More to see, more to come back for. Word is your game keeps surprising people.">>
<<goto "Computer">>
<</link>><<widget "addInfluence">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<if _amt > 0>>
<<set $assistant.influence = Math.min(100, $assistant.influence + _amt)>>
<</if>>
<<assistantCheck>>
<</widget>>
<<widget "assistantCheck">>
<<set _oldTier = $assistant.tier>>
<<if $assistant.influence >= 75>>
<<set _t = 4>> /* Reversal, NOT built in 0.2.0 */
<<elseif $assistant.influence >= 55>>
<<set _t = 3>> /* Arrangement */
<<elseif $assistant.influence >= 35>>
<<set _t = 2>> /* Entanglement */
<<elseif $assistant.influence >= 15>>
<<set _t = 1>> /* Flirtation */
<<else>>
<<set _t = 0>> /* Professional */
<</if>>
/* Affair-gate cap: until the trip is crossed, the relationship can't
resolve past tier 1 (Flirtation) no matter how high influence climbs.
Crossing the trip sets $assistant.affair, which lifts the cap. */
<<if not $assistant.affair and _t > 1>>
<<set _t = 1>>
<</if>>
/* Tier 4 (Reversal) is not built. Until it is, influence above 74
resolves to tier 3 rather than dropping the player into a tier with
no content. DELETE THIS BLOCK when tier 4 ships. */
<<if _t > 3>>
<<set _t = 3>>
<</if>>
<<set $assistant.tier = _t>>
<<set $assistant.tierUp = false>>
<<if $assistant.tier > _oldTier>>
<<set $assistant.tierUp = true>>
<</if>>
<</widget>>
<<widget "assistantReact">>
/* Check-in: flavour only, no influence. One beat per visit, cleared after. */
<<if $assistant.lastAction == "talk">>
<<if $assistant.tier == 0>>
<<set _beat = random(1, 5)>>
<<if _beat == 1>>
You stop at her desk and read over her shoulder a moment before saying anything, long enough that she has to sit with not knowing what you think.
<br><br>
<<speech "You" $name>>
It's good. Bit pleased with itself in places, but good.
<</speech>>
<<speech "Assistant" $assistant.name>>
...Pleased with itself.
<</speech>>
<<speech "You" $name>>
You'll grow out of it. Most people do.
<</speech>>
<br>
She almost argues, then doesn't, and files the note away with a small nod she'd rather you hadn't seen.
<<elseif _beat == 2>>
She's been waiting for you to look at the thing she flagged, too composed to say so, which is its own tell.
<br><br>
<<speech "Assistant" $assistant.name>>
When you have a minute.
<</speech>>
<<speech "You" $name>>
I've had several. I was seeing whether you'd ask twice.
<</speech>>
<<speech "Assistant" $assistant.name>>
And?
<</speech>>
<<speech "You" $name>>
You didn't. Good.
<</speech>>
<br>
She sits back, and there's the smallest thing in her face: pleased to have passed a test she'd deny taking.
<<elseif _beat == 3>>
She leans in over your screen to point something out, closer than she needs to be, and waits to see if you'll give ground. You don't. You let her be the one to notice she's the one who leaned.
<br><br>
<<speech "You" $name>>
Careful. People will think you're keen.
<</speech>>
<<speech "Assistant" $assistant.name>>
To fix your bug? Devastating.
<</speech>>
<<speech "You" $name>>
Mm. Keep telling yourself that's the bug.
<</speech>>
<br>
She straightens up a half-second too slow, and goes back to her desk without the last word, for once.
<<elseif _beat == 4>>
You catch her on her way out, coat over her arm, and don't quite let her leave.
<br><br>
<<speech "You" $name>>
The Kessler thing. You could've done it faster.
<</speech>>
<<speech "Assistant" $assistant.name>>
You could've given it to me sooner.
<</speech>>
<<speech "You" $name>>
I could have. I wanted to see how you'd do without me holding the map.
<</speech>>
<br>
She weighs that and decides to take it as the compliment it half is, which is exactly as much as you meant her to have.
<<else>>
She hands you a report you hadn't asked for yet, done early. You take it without looking at it, and watch her instead.
<br><br>
<<speech "You" $name>>
You do this a lot. Get ahead of me.
<</speech>>
<<speech "Assistant" $assistant.name>>
Is that a problem?
<</speech>>
<<speech "You" $name>>
No. It's a habit I'll allow. For now.
<</speech>>
<br>
The "for now" lands the way you meant it to, and she doesn't quite manage to look unbothered by it.
<</if>>
<<else>>
You stop by her desk. The talk stays light and lands easy, the way most things do between you now.
<</if>>
<<set $assistant.lastAction = "">>
<</if>>
<br>
<</widget>>
/* Single source of truth for whether the office loop is on the table.
Sets three temps in the caller's scope:
_hookupOffer she is available and willing tonight
_hookupReady he can actually afford it
_hookupLocked a cool-off is live
Called at the top of Helion Dynamics and Assistant Interact. Governs
the office loop only. The gym encounter has its own ladder, inline in
Helion Gym. Add office-loop clauses here only. */
<<widget "hookupGate">>
<<set _hookupLocked = ($assistant.affair and $gameDay < $assistant.coolOffUntil)>>
<<set _hookupOffer =
$assistant.affair
and $assistant.tier >= 2
and not _hookupLocked
and $job.attendedToday
and $weekday <= 5
and $time >= 4
and $time <= 5
and not $assistant.hookupToday>>
/* Energy is deliberately NOT part of the offer. She still looks up;
he is the one who cannot. The option renders greyed instead of
vanishing, so the hub never promises something the desk withholds. */
<<set _hookupReady = (_hookupOffer and $energy >= 2)>>
<</widget>>
<<widget "resetAssistantFlags">>
/* Heat decay. Must run BEFORE hookupToday is cleared: the flag still
holds yesterday's value at this point, so no $gameDay maths is needed.
Weekends included, by design. */
<<if not $assistant.hookupToday>>
<<set $assistant.heat = Math.max($assistant.heat - 1, 0)>>
<</if>>
<<set $assistant.hookupToday = false>>
<<set $assistant.hookupSource = "">>
<<set $assistant.spokeToday = false>>
<<set $assistant.probedToday = false>>
<</widget>>
/* Wipes every hookup-loop field. Called by the Control Panel reset and
jump buttons so they can't carry stale office state across a reset.
Add any new hookup variable here and the buttons stay correct. */
<<widget "clearHookupState">>
<<set $assistant.hookupToday = false>>
<<set $assistant.lastHookupDay = -99>>
<<set $assistant.hookupCount = 0>>
<<set $assistant.heat = 0>>
<<set $assistant.lastHookupLoc = "">>
<<set $assistant.lastHookupAct = "">>
<<set $assistant.heatTellDay = 0>>
<<set $assistant.coolOffPending = 0>>
<<set $assistant.coolOffUntil = 0>>
<<set $assistant.lastGymDay = -99>>
<<set $assistant.hookupSource = "">>
<</widget>>
<<widget "hookupLoc">>
<<set _locNames = {
bathroom : "the Bathroom",
office : "the Glass Office",
gym : "the Gym",
shower : "the Showers",
sauna : "the Sauna",
carpark : "the Car Park"
}>>
<<if _locNames.hasOwnProperty($assistant.lastHookupLoc)>>
<<print _locNames[$assistant.lastHookupLoc]>>
<<else>>
the Office
<</if>>
<</widget>><<set $assistant.met = true>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_meet1.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
The graduate intake is lined up in the glass room off the atrium, five of them in the careful clothes people wear before they've learned which rules are real, lanyards still stiff in their sleeves.
<br><br>
They sent you back down a floor for the morning. A week into the new job title and they already want you teaching the fresh college grads. New meat for the grinder, you think to yourself. A woman from HR runs the rotation schedule in the tone of someone reading a menu she's read a thousand times. You're down as a mentor now. Lead Engineer. Someone juniors get handed to.
<br><br>
Most of them watch HR. One of them watches you. She's near the end of the row, dressed a half step sharper than the rest without tipping into trying, and where the others have the bright, slightly frightened alertness of a first week, she has something quieter and more useful. She's reading the room, and she's most of the way through it. When HR pairs her to your rotation she doesn't look pleased, and she doesn't look nervous. She looks like someone who checked the org chart before she arrived and already knows what a Lead is worth.
<br><br>
Once the group breaks, she comes to find your desk rather than waiting to be fetched. She offers a hand and a level look.
<br><br>
<<speech "Assistant" $assistant.name>>
I'm $assistant.name. They told me you're the one who actually knows how the building works.
<</speech>>
<<speech "You" $name>>
I know some of it.
<</speech>>
<<speech "Assistant" $assistant.name>>
That's more than anyone else has admitted to. I learn fast. You won't have to say things twice.
<</speech>>
<br>
You spend the rest of the morning showing her the shape of the place: which systems matter, which meetings are theatre, where the real decisions get made and by whom. She's taught up to her clearance, but you keep her mostly in the dark about the bulk of Helion's dealings. She stays a half step behind and to the side, close enough to read your screen, and she asks the kind of questions that tell you she's already three moves past the answer. You notice you're enjoying it. You notice her noticing that you notice. Exactly how these things start.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed1.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Some days in and $assistant.name has a desk of her own now, two rows down from yours, and she is already carrying work the last graduate would have needed a month to touch. You come back from a meeting to find her waiting by your monitor, a laptop open against her arm.
<br><br>
<<speech "Assistant" $assistant.name>>
The migration script everyone's been rerunning by hand? It fails on the same record every night. I think someone hard-coded a date format in 2019 and no one's looked since.
<</speech>>
<<speech "You" $name>>
Show me.
<</speech>>
<br>
She does. She's right. It is a small thing and a real one, the kind most people walk past for years, and she found it on her first week.
<br><br>
<<speech "You" $name>>
Good catch. Write it up and put my name on the review, not yours. It'll go further with mine on it.
<</speech>>
<<speech "Assistant" $assistant.name>>
I know. That's why I brought it to you and not to them.
<</speech>>
<br>
She says it lightly, already turning back to her desk, and it takes you until she's gone to notice she has just told you exactly how she operates, and that she wanted you to hear it. Not bad for a grad.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed2.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
The all-hands runs forty minutes long on a deck that could have been an email. Halfway through, a VP says the word "synergies" without irony and you feel, rather than see, $assistant.name's glance flick to you across the room. You keep your face still. Hers is a study in attentive nothing. It is the most professional either of you has ever looked, and you both know exactly why.
<br><br>
Afterward, in the corridor:
<br><br>
<<speech "Assistant" $assistant.name>>
I counted four action items. None of them were actions. One of them was a feeling.
<</speech>>
<<speech "You" $name>>
That's the job. Most of this building is people performing work at each other. You'll learn to tell the part that's real.
<</speech>>
<<speech "Assistant" $assistant.name>>
I already can. I'm looking at it.
<</speech>>
<br>
She holds the line just long enough for it to mean the work, or to mean you, then she's gone down the corridor before you have to decide which. You notice you're smiling at nothing. You make yourself stop.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed3.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Late in the afternoon the floor has thinned out, and $assistant.name pulls a chair around to your side of the desk to look at something on your screen. Close, this time. Closer than the work strictly needs. You can smell whatever she wears, something clean and not cheap, and when she leans in to point at a line of code her shoulder comes to rest an inch from yours and stays there.
<br><br>
<<speech "Assistant" $assistant.name>>
There. That's the branch that never runs. You've been reading past it for twenty minutes.
<</speech>>
<br>
You have been reading past it because for twenty minutes you have been extremely aware of exactly how close she is sitting. You don't say that. She knows the branch is what you missed, and she is too sharp not to know why. She doesn't move away.
<br><br>
<<speech "You" $name>>
Right. Good. Fix it and push it.
<</speech>>
<<speech "Assistant" $assistant.name>>
Mm.
<</speech>>
<br>
She takes the mouse from under your hand, unhurried, her fingers passing over yours on the way, and does the fix herself while you sit there and let her. Nothing happens. Nothing has to. By the time she rolls back to her own desk the line is somewhere well behind you, and you couldn't say when you crossed it.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.seedStage++>>
<<set $assistant.lastSeedDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_seed4.jpeg">>
<h2>Helion Dynamics</h2>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Last week of the rotation, and a fault in the payments reconciliation has the two of you shut in a booked meeting room past one o'clock, half the whiteboard gone, two trays of supermarket sushi open between the laptops. Neither of you called it lunch. It just became lunch somewhere around the second failed theory.
<br><br>
<<speech "Assistant" $assistant.name>>
The total's right and every single line is wrong. It's balancing by coincidence.
<</speech>>
<<speech "You" $name>>
It's balancing the way Helion balances. Nobody knows why, nobody's brave enough to touch it, and there's a bonus attached to not asking.
<</speech>>
<br>
And she laughs. A real one, caught out of her, nothing careful left in it, and for a second she is just a person who found something funny instead of the most composed grad in the building. It's the first time you've seen it. You find you would like to see it again.
<br><br>
She picks a piece off the tray, and the room settles, and when she speaks again the register has changed by a degree you'd miss if you weren't already paying her too much attention.
<br><br>
<<speech "Assistant" $assistant.name>>
Placements for the graduates went out this morning. Everyone got theirs.
<</speech>>
<<speech "You" $name>>
And?
<</speech>>
<<speech "Assistant" $assistant.name>>
Everyone except me. Mine's still "under discussion." Someone's arguing to keep me on this team, specifically. I wondered if you knew who.
<</speech>>
<br>
You do know who. You put your name to it on Tuesday. You could tell her that. You could also say nothing and let her arrive at it, which she already has, because she asked the question in a room with exactly one other person in it.
<br><br>
<<speech "You" $name>>
I'd keep working the reconciliation, if I were you. Sounds like you'll be here a while.
<</speech>>
<br>
She holds your eye a moment, then nods once, the way someone confirms a number they'd already worked out and only wanted checked against the source. She doesn't thank you. Thanking you would name it. She just goes back to the sushi and the branch that never balances, and the rotation is all but over, and neither of you has to say where she's landing.
<br><br>
<<link "Get on with your day." $return>><</link>><<set $assistant.unlocked = true>>
<<set $job.eventToday = false>>
<<set _img = "images/characters/a/a_reunion1.jpeg">>
<h2>Helion Dynamics</h2>
The corner office comes with a team, and you don't read the roster properly until your second coffee. One row under your own name, where it lists who reports to you now, is a name you already know. Not a grad on rotation any more. Hired on, permanent, and assigned to you.
<br><br>
You're not surprised. You're the one who put your name down to keep her, back when her placement was still "under discussion." It went through.
<br><br>
When you look up she's already crossing the floor toward the glass, and she stops in your doorway, waiting, the way she does, until she's told.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
You wave her in. She sits.
<br><br>
<<speech "Assistant" $assistant.name>>
So they gave me to you. I asked for it, so I won't pretend I'm surprised.
<</speech>>
<<speech "You" $name>>
You asked.
<</speech>>
<<speech "Assistant" $assistant.name>>
I asked. You taught me how this place actually works when nobody else could be bothered. I'd rather work for someone who already understands me than someone I'd have to explain myself to. It's simpler. For both of us.
<</speech>>
<br>
Every word of it is true, and none of it is the whole of what she means. You know that. She knows you know it. Neither of you says the rest, because it doesn't need saying and it's safer left where it is.
<br><br>
<<speech "Assistant" $assistant.name>>
Anyway. I'm yours to point at whatever you need. Tell me where you want me and I'll make you look good doing it.
<</speech>>
<br>
You let that sit a moment before you answer, because you can, and because she's watching to see whether you will. She works for you now. Whatever this becomes, it starts from there, and you're the one who decides what you ask of her and when.
<br><br>
Then she's back to the desk that's hers now, one row down and inside your eyeline all day. The door that stayed shut through the whole rotation isn't shut any more. Nothing has happened yet. She's made herself useful and left the next move to you.
<br><br>
<<link "Get to work." $return>><</link>><h2>With $assistant.name</h2>
<<hookupGate>>
/* Establishing shot, idle entry only. Once an action is chosen, its own
narration (via assistantReact) replaces this. */
<<if $assistant.lastAction == "">>
<<if $assistant.tier == 0>>
She looks up as you cross to her desk and sets her work aside, because you're the reason she can afford to. Professional to the last inch, and waiting to see what you want.
<<elseif $assistant.tier == 1>>
She clocks you coming before you're halfway there and doesn't pretend otherwise. Nothing's been said out loud, but it colours the way she turns her chair toward you.
<<elseif $assistant.tier == 2>>
She meets your eye as you reach her, a private steadiness in it the open-plan floor knows nothing about. She lets you set the register.
<<else>>
She's half-anticipated the reason you've come over, the way she anticipates most things now, and gives you the small unbothered look that means she'll follow your lead.
<</if>>
<</if>>
<<assistantReact>>
<br>
''What do you do?''
<br>
/* CHECK IN — daily one-shot, flavour only, no influence. */
<<if not $assistant.spokeToday>>
<<link "Stop by her desk a moment.">>
<<set $assistant.spokeToday = true>>
<<set $assistant.lastAction = "talk">>
<<goto "Assistant Interact">>
<</link>>
<<else>>
//You've already found a reason to stop at her desk today.//
<</if>>
<br>
/* PROBE */
<<if $assistant.tier <= 1>>
<<if not $assistant.probedToday>>
<<link "Find a reason to get closer than the work needs." "Assistant Probe">><</link>>
<<else>>
//You've pushed your luck with her once today. Leave it there.//
<</if>>
<br>
<</if>>
/* OFFICE LOOP — tier 2+, end of the workday. See the hookupGate widget
for the full condition. */
<<if _hookupOffer>>
<<if _hookupReady>>
<<link "Tell her you'll need ten minutes of her time." "Assistant, Hookup">>
<<set $assistant.hookupSource = "office">>
<</link>>
<<else>>
//You could ask her for ten minutes. There is nothing left in you to do anything with them.//
<</if>>
<br>
<<elseif _hookupLocked>>
//She has drawn a line under it for the moment, and you are not going to be the one who tests it.//
<br>
<</if>>
<br>
<<link "Back to your desk." $return>><</link>><<set $assistant.probedToday = true>>
/* ── Scene catalogue: id + influence needed to unlock. Escalates by band. ── */
<<set _scenes = [
/* Band A — testing the water (gaze and word only, no contact) */
{ id: "hemglance", min: 0 },
{ id: "holdgaze", min: 0 },
{ id: "noticed", min: 0 },
{ id: "nickname", min: 0 },
{ id: "lookover", min: 0 },
/* Band B — small liberties (first contact; her body; personal territory) */
{ id: "skirt", min: 8 },
{ id: "sorority", min: 8 },
{ id: "reachpast", min: 8 },
{ id: "shoulder", min: 8 },
{ id: "blouse", min: 8 },
{ id: "waiting", min: 8 },
{ id: "overhear", min: 8 },
/* Band C — charged and complicit (both know; he enjoys the effect) */
{ id: "chin", min: 18 },
{ id: "lift", min: 18 },
{ id: "lowerback", min: 18 },
{ id: "selfie", min: 18 },
{ id: "manspread", min: 18 },
{ id: "coatcollar", min: 18 },
{ id: "pen", min: 18 },
{ id: "chair", min: 18 }
]>>
/* Eligible = unlocked by influence, minus the one shown last time. */
<<set _pool = _scenes.filter(s => $assistant.influence >= s.min && s.id !== $assistant.lastProbe)>>
<<if _pool.length === 0>>
<<set _pool = _scenes.filter(s => $assistant.influence >= s.min)>>
<</if>>
<<set _pick = _pool.random()>>
<<set _img = "images/characters/a/a_probe_" + _pick.id + ".jpeg">>
<<set $assistant.lastProbe = _pick.id>>
<<addInfluence 2>>
<h2>With $assistant.name</h2>
<<switch _pick.id>>
/* ── BAND A ── */
<<case "hemglance">>
You're mid-sentence about the ticket she's working when your eyes leave her face and go down her, unhurried, to the hem of her shirt. You let them rest there a beat past anything she could call innocent, then bring them back up as though nothing had moved at all. She has lost whatever she was about to say. You don't help her find it. The pause sits there in the open, and you let it stay her problem to solve.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<case "holdgaze">>
The sentence ends and you keep looking at her a second longer than it needed, then another, past the point where a normal person would have glanced at their screen or the window or anything else. You just hold it, easy, waiting. She lasts longer than most would. Not long enough.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She's the one who breaks, eyes dropping back to her monitor, and you let her think she chose to.
<<case "noticed">>
She's been reading something on her screen with a small crease between her brows, and when she turns to you it's still there.
<br><br>
<<speech "Assistant" $assistant.name>>
Can I ask you something about the numbers on the Vantage contract, the ones that don't...
<</speech>>
<br>
She stops herself. You watch her decide, in real time, that whatever she was about to pull on is a thread better left where it is, and she folds her hands back in her lap.
<br><br>
<<speech "Assistant" $assistant.name>>
No. I won't ask.
<</speech>>
<<speech "You" $name>>
Good girl.
<</speech>>
<br>
You let it sit there, because it wasn't a work thing to say and you both heard that it wasn't. She holds your eye a beat, colour just touching her face, filing it, and doesn't tell you not to say it again.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<case "nickname">>
She's turned the assignment around faster than you expected and hands it back almost sheepish about how quick she was.
<br><br>
<<speech "You" $name>>
That was fast. Quickie. Think that's what I'm calling you now.
<</speech>>
<br>
You say it like it's already settled, already turning back to your own screen before she can decide whether to be insulted. The word is out there now, hers to object to later if she can find the moment, and you've made sure she can't.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<case "lookover">>
She's telling you something about the sprint board and you lean back in your chair and look her over, once, slow, top to bottom, while she talks. You don't hide it and you don't hurry it. Then, when you've finished:
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "You" $name>>
Sorry. Say the last part again.
<</speech>>
<br>
As if you'd been listening. She knows you weren't. Her chin comes up a fraction while she decides how to play it, and she starts the sentence over, because the alternative is naming what just happened, and neither of you is going to be the one to do that.
/* ── BAND B ── */
<<case "skirt">>
You fall into step a pace behind her on the way to the meeting room, and as the glass corridor narrows you say it quietly, just for her.
<br><br>
<<speech "You" $name>>
That's a good skirt on you. In case nobody's told you today.
<</speech>>
Then you keep walking, past her, like you'd remarked on the weather.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<<speech "Assistant" $assistant.name>>
...Thank you?
<</speech>>
<br>
She says it to your back, half a question, glancing after you down the length of the glass and not sure what she's supposed to do with it.
<<case "sorority">>
She's telling you a story about undergrad, some group project that fell apart, and she lets slip which sorority house she was in.
<br><br>
<<speech "You" $name>>
Oh, I knew girls from that house. They knew how to throw a party.
<</speech>>
<<speech "Assistant" $assistant.name>>
We had a reputation. Most of it well earned.
<</speech>>
<<speech "You" $name>>
So I guess you did the naked run? The one across the quad. I heard that was a house tradition.
<</speech>>
<br>
She goes a little pink, caught out that you'd know about it, caught worse that you'd ask.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
That is so far above your pay grade to be asking me.
<</speech>>
<br>
But she's smiling when she says it, and she doesn't say no.
<<case "reachpast">>
There's a folder on the far side of her desk and you don't ask her to pass it.
<br><br>
<<speech "You" $name>>
Just gonna grab this.
<</speech>>
<br>
You lean in across her to reach it, close, your arm going past her shoulder, your weight coming to rest against her for a second longer than reaching actually takes. You're unbothered about the space, like it's yours to move through.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
You could've just asked me for it.
<</speech>>
<<speech "You" $name>>
I could've.
<</speech>>
<br>
You straighten up with the folder, in no rush about it, and she lets out a breath she'd been holding.
<<case "shoulder">>
You come around to read something over her shoulder, and your hand settles on it while you look, your thumb coming to rest at the edge of her collar. You're in no hurry to move it.
<br><br>
<<speech "You" $name>>
There. That line. You've indented it into the wrong block.
<</speech>>
<br>
You say it like your hand isn't there at all, like this is a perfectly normal way to stand over someone.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
Her posture shifts under your hand, a small resettling, but she doesn't shrug it off and she doesn't lean away. She fixes the line with your thumb still at her collar, and says nothing about it.
<<case "blouse">>
She's wearing a fine pendant today, worn outside the knit, and it hangs low enough that it sits well down her front. You look at it. You keep looking a beat past where the pendant stops being the reason.
<br><br>
<<speech "You" $name>>
That's nice. What's the stone?
<</speech>>
<br>
You lean in a little closer than you need to for a better look, not in any hurry to lift your eyes back up.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
It's, um. Garnet. My grandmother's.
<</speech>>
<br>
Her hand comes up to it, half to show you and half to cover, and she's colouring, well aware of where you were actually looking.
<<case "waiting">>
Her desk is stacked, two review queues deep and a deployment on top of it, the kind of pile that means she's not getting out of here at a decent hour.
<br><br>
<<speech "You" $name>>
That's a long night you've got in front of you. Some lucky guy waiting at home for you, or does he get used to the wait?
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
No one's waiting. Just this pile.
<</speech>>
<br>
A guarded little laugh, thrown that you'd ask, and she goes back to her screen a touch too quickly.
<<case "overhear">>
You catch the tail of something as you pass her desk, her voice low on the phone, saying she can't tonight, she's swamped. She hangs up when she sees you and doesn't explain it.
<br><br>
<<speech "You" $name>>
Cancelling plans for this place. It gets its hooks in fast.
<</speech>>
<<speech "Assistant" $assistant.name>>
It wasn't plans. It was my mother.
<</speech>>
<<speech "You" $name>>
Good. I'd hate to think I was keeping you from something.
<</speech>>
<br>
You let the "I" sit there, since you both heard that it's you keeping her, not the work.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She holds your look for a second, then goes back to her screen, and doesn't tell you that you're not.
/* ── BAND C ── */
<<case "chin">>
Her attention has drifted off the screen and onto you again, and this time you don't let it pass. You take her chin between your finger and thumb and turn her head, slow, back toward the monitor, and hold it there a beat longer than the gesture needs, so she feels that it was never about the screen.
<br><br>
<<speech "You" $name>>
Eyes front. You're no use to me distracted.
<</speech>>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She lets you. That's the thing she can't get past afterward, that she just let you, her chin resting in your fingers and her eyes on yours the whole way round and not one word of protest anywhere in her. When you finally let go she turns back to the work too fast, ears burning, and pretends for both of you that it didn't happen.
<<case "lift">>
The lift doors close with just the two of you inside, and you don't do anything so obvious as speak first. You shift, once, so you're standing nearer than the empty car gives you any excuse for, your shoulder almost to hers, and you let the quiet sit there and get heavy. Two floors down, without looking at her:
<br><br>
<<speech "You" $name>>
You can relax. I don't bite in lifts.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
<br>
<<speech "Assistant" $assistant.name>>
I'm perfectly relaxed.
<</speech>>
<br>
She says it to the floor numbers, cheeks warm, not moving into the space she could and not out of it either, and when the doors open she's out a little too quickly, not trusting herself to walk slow.
<<case "lowerback">>
The meeting empties out and the two of you are last to the door. You reach it a half-step ahead, hold it, and stand aside for her.
<br><br>
<<speech "You" $name>>
Ladies first.
<</speech>>
<br>
As she passes through you settle your hand at the small of her back to guide her, and you let it ride a little lower than a hand has any business being, and you keep it there a pace or two into the corridor before you let her go.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She walks. That's all she does, she just keeps walking, spine very straight and colour rising, because stopping would mean turning around and turning around would mean saying something, and she doesn't have the something ready. Your hand is gone by the time she thinks of it.
<<case "selfie">>
You come around the corner and catch her mid-pose over her own phone, tongue out and face aimed at the camera for a friend. She kills it the second she clocks you, mortified, screen to her chest.
<br><br>
<<speech "Assistant" $assistant.name>>
That was not, that's for my sister, she sends me stupid ones and I have to...
<</speech>>
<<speech "You" $name>>
Send it to me.
<</speech>>
<<speech "Assistant" $assistant.name>>
I'm not sending you that.
<</speech>>
<<speech "You" $name>>
Send it to me.
<</speech>>
<br>
You hold her eye, making sure she stays uncertain whether that was an order or just a joke.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
A second later your phone buzzes in your pocket. Looking over at her, she's gone bright red and won't look at you, already turning back to her monitor, but she sent it.
<<set _selfieImg = "images/characters/a/a_probe_selfie_phone.jpeg">>
<<set _selfieCap = $assistant.name + " sent it. Day " + $gameDay + ".">>
<<galleryAdd _selfieImg _selfieCap>>
<br><span class="good">Saved to your gallery.</span>
<<case "manspread">>
You've pulled a chair over to go through the roadmap with her, except the couch has put her down lower than you, knees together, notebook balanced, looking up to where you sit. You don't correct the height difference. You settle back, spread out, one ankle coming to rest over the other knee, taking up the room like the room was always yours, and you carry on talking through the quarter as if you hadn't just filled the space between you.
<br><br>
<<speech "You" $name>>
So the second milestone slips a week. That's fine. What doesn't slip is the demo.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She keeps her eyes up, on your face, very deliberately on your face, and answers the point about the demo a half-beat late. She's not going to look anywhere but your face and you can see the effort that's costing her, the careful discipline of a woman deciding, second by second, exactly where her gaze is allowed to land. You let the pause after her answer run long, at your leisure, and she fills it too quickly with the next line item, glad of somewhere to put her eyes.
<<case "coatcollar">>
She's shrugging into her coat to leave and it's caught, bunched up at the back, and you step in behind her and free it, smoothing the collar down flat with both hands, standing closer than helping with a coat requires and taking longer over it than it needs.
<br><br>
<<speech "You" $name>>
There. Presentable.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She holds still for it, arms half in her sleeves, letting you settle the coat on her shoulders like it's a normal thing for a manager to do. When she thanks you it comes out too quiet, and she's out the door before the warmth in her face can turn into anything she'd have to explain.
<<case "pen">>
She's clicking a pen while she reads, that fast nervous double-click people do without knowing, and you reach over without a word and close your hand over hers to still it. Not a grab. Just your hand over her hand, folding the pen and her fingers quiet together, and you leave it there while you finish reading the line on her screen as though nothing about it needs remarking on.
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She stops breathing for a second. You can feel it, the small held stillness of her hand under yours, and she doesn't pull it back. When you've read what you wanted to read you take your hand away, unhurried, and go on with the point you were making, and she sets the pen down very carefully on the desk, out of reach of herself, like it can't be trusted. She doesn't pick it up again while you're standing there.
<<case "chair">>
You need her looking at the same screen as you and you don't ask her to come over. You take hold of the back of her wheeled chair, both hands, and you pull, and she comes with it, rolled clean across the floor from her desk to yours before she's decided whether that's allowed. You park her where you want her, at your shoulder, facing your monitor.
<br><br>
<<speech "You" $name>>
There. Now look at this properly.
<</speech>>
<br>
<div class="intro-image wide"><img @src="_img" width="100%"></div>
She lets herself be moved. That's the part she'll turn over later, that her feet came up off the floor and she just let you wheel her across the office like something you were entitled to reposition, and that she liked it more than she has any way to explain. She sits where you've put her, close in at your side now, and looks at the screen because looking at the screen is easier than looking at how near you've parked her.
<</switch>>
<br><br>
<<link "Back to your desk." $return>><</link>><<set $assistant.flirtStage++>>
<<set $assistant.lastFlirtDay = $gameDay>>
<<set $job.eventToday = false>>
<<set $time = 8>>
<<addInfluence 2>>
<<set _img = "images/characters/a/a_flirt1.jpeg">>
<h2>Helion Dynamics</h2>
The build ships at half past five, clean, after a day where nobody expected it to survive. Somebody says the word "drinks" and it moves through the team like a decision that was already made. Somewhere in town with a cocktail list and filament bulbs and prices that assume you're expensing it.
<br><br>
You thumb a text to $wife.name on the walk down.
<br>
<div class="chat">
<div class="bubble out">team landed the big one, going out for a drink with them, back later</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Go you! Have one for me. Love you 💚</div>
<<elseif $wife.mood <= -1>>
<div class="bubble in">ok</div>
<<else>>
<div class="bubble in">Sure. Don't be too late.</div>
<</if>>
</div>
You pocket it and go in.
<br><br>
It's a good night. The kind the job owes you and rarely pays. $assistant.name is three seats down at first. Around the second round a chair opens up across from you and you take it, because from there you can see her, and the shop talk burns off and what's left is easier than shop talk has any right to be. She's funny when she isn't being careful. She lets herself be funny.
<br><br>
Coworkers peel off in ones and twos until it's the two of you on the pavement, and even that arrives without anyone arranging it. Different directions home. Same cold. You both stand at the curb thumbing for cars that are eight minutes out.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
She's not dressed for standing still this late and it shows, arms crossed, a shiver going through her before she can stop it. Your jacket's off and around her shoulders before the thought's all the way finished. She doesn't shrug it off. She pulls it a little closer.
<br><br>
<<speech "Assistant" $assistant.name>>
You'll freeze.
<</speech>>
<<speech "You" $name>>
I'll live. Keep it till your car comes.
<</speech>>
<br>
She gets the first car. She shrugs the jacket off and hands it back and for a second you're both holding it, and then she leans in and kisses you once on the cheek, quick, warm, gone before you've filed what it was.
<br><br>
<<speech "Assistant" $assistant.name>>
Goodnight. Thanks for the warmth.
<</speech>>
<br>
Then she's folded into the back seat and the door's shut and the car's pulling into the dark, and you're standing on a cold street with a jacket that smells faintly of her and a reply from your wife still sitting in your pocket. You put the jacket back on. It's warmer than it was. You know the peck on the cheek won't be mentioned come next workday, but right now it's all you can think of.
<br><br>
<<link [[Head home.|Living Room]]>><</link>><<set $assistant.flirtStage++>>
<<set $assistant.lastFlirtDay = $gameDay>>
<<set $job.eventToday = false>>
<<set $time = 8>>
<<addInfluence 2>>
<<set _img = "images/characters/a/a_flirt2.jpeg">>
<h2>Helion Dynamics</h2>
A latency spike in a service you own decides to reveal itself at four in the afternoon, which means it isn't getting fixed by six. $assistant.name stays without being asked. She just doesn't leave, orders Thai to the floor on the company account, and sets up across your desk with the log tailing on her screen. The floor empties out around the two of you until it's your lamp and hers and a long dark room.
<br><br>
You text $wife.name. The words are nothing. What they leave out is that you'll be alone in a quiet building with your assistant until the small hours, and that she'll read them and picture a room full of engineers, and that you know she will, and send them anyway.
<br>
<div class="chat">
<div class="bubble out">chasing a production issue, going to be late, don't wait up</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Poor you. There's leftovers in the fridge if you're starving when you're back. Don't work too hard 💚</div>
<<elseif $wife.mood <= -1>>
<div class="bubble in">Of course you are.</div>
<<else>>
<div class="bubble in">Ok. I'll leave the hall light on.</div>
<</if>>
</div>
You put the phone face down and get back to it.
<br><br>
You find the bug around eleven, together, her hand landing flat on the desk when the graph goes flat with it, a small triumphant "there." It's a good feeling and it isn't only the fix. You pack up. She pulls her coat on. You kill your lamp and start across the floor for the lifts, and halfway there the building decides no one's here.
<br><br>
The lights go out. All of them, in a wave, the motion sensors giving up on a floor that reads as empty. Full dark, thirty floors up, the city a grid of little lights through the glass and nothing else.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
She startles at the sudden black and her hand shoots out and finds your arm, closes on it, and for a second she's up against your side, gripping, before her brain catches up to the fact that it's only the lights. She doesn't let go straight away. Neither of you moves. You can hear her breathe. The dark holds the two of you exactly where it caught you a beat longer than surprise can account for.
<br><br>
<<speech "Assistant" $assistant.name>>
...I can't see a thing.
<</speech>>
<<speech "You" $name>>
Hold on.
<</speech>>
<br>
You lift your free arm and wave it at the ceiling, and the sensor catches it, and the floor floods back to light all at once. She's right there, her hand still on your arm, blinking in the brightness, and then she registers where her hand is and how she got there and takes it back, one clean step out of your space, colour climbing her throat.
<br><br>
<<speech "Assistant" $assistant.name>>
Motion sensors. Right. Obviously.
<</speech>>
<br>
She's flustered and ironing it flat and not quite managing, and it's a good look on someone usually so composed, and you let her carry it into the lift without helping her out of it. Neither of you says anything on the way down that the lift couldn't have overheard. But you both felt her hand find your arm in the dark, and how long it stayed.
<br><br>
<<link [[Head home.|Living Room]]>><</link>><<set $assistant.flirtStage++>>
<<set $assistant.lastFlirtDay = $gameDay>>
<<set $job.eventToday = false>>
<<addInfluence 2>>
<<set _img = "images/characters/a/a_flirt3.jpeg">>
<h2>Helion Dynamics</h2>
It's a light day. The sprint's ahead of itself, your calendar's a graveyard of cancelled check-ins, and by two o'clock you've done everything today actually needs. So you take the half hour the job owes you and go down to the gym.
<br><br>
You're on the mats when $assistant.name comes in, and you both do a small stall, two people recalibrating from the office version of each other to this one. Training kit. Hair up. No lanyard, no deference in how she's standing. Just someone who clearly uses this place, in at the same odd hour as you.
<br><br>
<<speech "Assistant" $assistant.name>>
Don't tell me you actually work out. I had you down as all-desk.
<</speech>>
<<speech "You" $name>>
Light day. Thought I'd remember what my legs are for. You?
<</speech>>
<<speech "Assistant" $assistant.name>>
Every day I can. Spot me and I won't tell anyone you skipped an afternoon.
<</speech>>
<br>
So you train together, and down here neither of you is anyone's boss. You spot her on the bench, close over the bar while she presses, near enough to catch the heat coming off her and the shine already on her skin. She counts your reps back at you. You end up matching pace on the machines without deciding to, both of you breathing hard, both of you damp with it.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
There's a charge in it, and it isn't the office kind, the one you build on purpose. This one just exists, in the sweat and the proximity, in her flushed and gasping and laughing at something and not bothering to smooth it away. The frame's off and nobody took it off. You could reach for her right now and she knows it as well as you do. You don't, and the not-doing sits between you and says more than a hand ever would.
<br><br>
She racks the last set and drops back against the pad, chest heaving, hair stuck to her temple, and grins up at you wrecked and unguarded. The look holds a beat too long, and it's one of you, and you couldn't say which, who breaks it.
<br><br>
<<speech "Assistant" $assistant.name>>
I'm going to go die in the shower now. Good session.
<</speech>>
<<speech "You" $name>>
Good session.
<</speech>>
<br>
She goes, and you sit a moment longer than you need to, heart still up. That was the closest yet, and it happened with neither of you pushing. Whatever comes next won't happen in this building.
<br><br>
<<link "Hit the showers." $return>><</link>><<set $assistant.lastTripOfferDay = $gameDay>>
<<set $job.eventToday = false>>
<<set _yes = "\"I'm in. I'll take " + $assistant.name + " to run support.\"">>
<h2>Helion Dynamics</h2>
It's past four when Rick from the deployment side puts his knuckles on your doorframe instead of knocking. He doesn't sit down. He never does. Standing keeps the conversation his.
<br><br>
<<speech "Manager" "Rick">>
Something's on fire and it's out of state. You know the model. We don't just ship the client software, we put one of ours inside their building. Forward deployed. On site, making the stack do what sales promised it would when the load is real.
<</speech>>
<<speech "You" $name>>
I know the model. Who fell over?
<</speech>>
<<speech "Manager" "Rick">>
The engineer embedded on this one stopped working here about three hours ago. Doesn't matter why. What matters is the client expects somebody in that chair at nine tomorrow morning, and it has to be somebody senior enough that they don't feel downgraded. That's you.
<</speech>>
<br>
He tells you who the client is the way people here tell you who the client is, which is to say he tells you almost nothing. Three letters, a subdivision of them that doesn't appear on any org chart you'd be cleared to read, the kind of buyer that pays for the locating work and never turns up in a case study. What they want tuned is the part of the platform that takes one fragment of a person and hands back the rest of them. Where. Who with. Where next.
<br><br>
<<speech "Manager" "Rick">>
Two days. Out tomorrow, back the day after. Paid on top of salary, there's a bonus attached for stepping in this fast, and it's the kind of client you want to have been useful to. Take one of your people to run support so you're not doing the grunt work on your own.
<</speech>>
<br>
One of your people. Neither of you looks out at the floor when he says it, and you both know there's exactly one name that fits. One row down, inside your eyeline, currently doing a very convincing job of reading her screen and not your office.
<br><br>
There's a version of this where you tell him to find somebody else. The last few months stay exactly where they are, charged and deniable and safe, and you go home tonight to the life you actually built.
<br><br>
<<speech "Manager" "Rick">>
I need the answer now, not in the morning. Wheels up at eight.
<</speech>>
<br>
<<link _yes>>
<<set $assistant.tripPending = true>>
<<goto 'Assistant, Trip Offer Accept'>>
<</link>>
<br>
<<link "\"Give it to someone else this time.\"">>
<<goto 'Assistant, Trip Offer Decline'>>
<</link>><h2>Helion Dynamics</h2>
Rick is thumbing his phone and halfway down the corridor before you've finished the sentence. The posting is yours, and so is the second seat, and you named who was going in it out loud in front of him without a flicker, like it was the obvious operational call and nothing else.
<br><br>
You cross to her desk. She's already half turned, having heard her own name travel across the floor.
<br><br>
<<speech "You" $name>>
Pack a bag tonight. Out of state tomorrow, two days. A client I can't name until we're on the plane. You're running support. Wheels up at eight.
<</speech>>
<<speech "Assistant" $assistant.name>>
Two days. With you.
<</speech>>
<<speech "You" $name>>
With me. Problem?
<</speech>>
<<speech "Assistant" $assistant.name>>
No. I'll be at the gate at seven.
<</speech>>
<br>
She keeps her face flat. Then she writes the time on the back of her hand instead of putting it in her calendar, presses harder with the pen than she needs to, and goes back to her screen.
<br><br>
You've got a bag to pack and $wife.name to tell, and the whole way home you're working out how much of the truth is going into the version she gets.
<br><br>
<<link "Head home." "Assistant, Trip Pack">><</link>><h2>Helion Dynamics</h2>
<<speech "You" $name>>
Not this one. Timing's bad at home. Find somebody else.
<</speech>>
<<speech "Manager" "Rick">>
Your call. I'll strong-arm someone off the other team before six.
<</speech>>
<br>
He's scrolling for the next name before he's out of your doorway, entirely unbothered, and the door you had cracked open swings shut again.
<br><br>
It was the right call. It was also the safe call. You tell yourself those are the same call and mostly get away with it.
<br><br>
$assistant.name watched the shape of that conversation through the glass without hearing a word of it, watched Rick leave, and watched you not come out after him. When you look over she's already back on her screen. Two days out of this building with her, and you handed them to somebody on the other team. At five thirty she stops at your door on her way out, says goodnight the same way she does every other day, and doesn't ask.
<br><br>
<<link "Get back to it." $return>><</link>><<set $time = 8>>
<<moodShift -1>>
<<set _img = "images/characters/w/w_trip_pack.jpeg">>
<h2>Home</h2>
You get the bag down from the top of the wardrobe and start filling it, and $wife.name appears in the doorway with a dish towel still in her hands, reading the suitcase before she reads you.
<br><br>
<<speech "Wife" $wife.name>>
You're going somewhere.
<</speech>>
<<speech "You" $name>>
Out of state, first thing tomorrow. A client thing went sideways and they need somebody senior on site. Two days. Back the night after.
<</speech>>
<<speech "Wife" $wife.name>>
Tomorrow. As in you're telling me the night before.
<</speech>>
<<speech "You" $name>>
As in they told me this afternoon. It isn't the kind of ask you say no to. It's paid on top, there's a bonus, and it gets noticed by the people who decide the next rung.
<</speech>>
<br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
She watches you fold a shirt badly and doesn't come over to fix it, which is its own small verdict. The fight doesn't come either. She's tired, the money is real, and she's spent long enough on the other end of that company's phone calls to know the difference between a thing you chose and a thing that chose you. Or the difference she thinks she can see.
<br><br>
<<speech "Wife" $wife.name>>
Fine. Go be important. Anyone else going, or is it just you flying the flag?
<</speech>>
<br>
It's an ordinary question. She asks it the way she'd ask if you wanted the last of the coffee, already half turned back toward the kitchen.
<br><br>
<<speech "You" $name>>
Just me. In and out.
<</speech>>
<br>
And there it is. Not a thing left carefully unsaid, not a technically true sentence with a shadow in it, which is how you've played it for months. A flat lie, told to your wife's face over a half packed bag. The worst of it is how little it costs you. It comes out smooth, it lands unremarkable, she nods and goes back to the dishes, and you carry on folding.
<br><br>
<<link "Finish packing." "Living Room">><</link>><<set $assistant.tripPending = false>>
/* The trip is company business. Credit the day as worked so workCheck
in PassageReady doesn't fine him for never clocking in, and fire
payday manually since clockIn is what normally triggers it. */
<<set $job.attendedToday = true>>
<<if $weekday <= 5>>
<<set $job.daysWorked += 1>>
<</if>>
<<if $weekday == 5>>
<<payday>>
<</if>>
<<set _img = "images/characters/a/a_trip_airport.jpeg">>
<h2>The Airport</h2>
You're out of the flat before it's fully light, bag by the door from last night, the coffee you made going cold before you reach the end of the street. From the terminal you thumb a last word to $wife.name, a small confirmation of the version of this she was given.
<br><br>
<div class="chat">
<div class="bubble out">at the gate now. see you tomorrow night x</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Safe flight. Bring me back something terrible from the airport 💚</div>
<<elseif $wife.mood <= -1>>
<div class="bubble in">Fine. Text me when you land.</div>
<<else>>
<div class="bubble in">Ok. Let me know when you're there.</div>
<</if>>
</div>
<br>
You put the phone away as you spot her.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
$assistant.name is already at the gate, one neat bag, coffee in hand, dressed for a client and not for a holiday and knowing the difference. She finds you in the crowd before you reach her, and there's a beat where neither of you is anyone's boss, just two people who agreed to get on a plane together and are only now feeling the weight of the yes.
<br><br>
<<speech "Assistant" $assistant.name>>
Seven, like I said. Are you going to tell me who the mystery client is, or do I guess for the whole flight?
<</speech>>
<<speech "You" $name>>
On the plane. It's the kind of name you say quietly or not at all.
<</speech>>
<br>
You board together. Her shoulder settles against yours somewhere over the first state line and stays there, and the two of you talk low the whole way about a client you would both deny knowing the name of the moment you're back on the ground.
<br><br>
<<link "Land." "Assistant, Trip Client">><</link>><<set $job.performance += 3>>
<<set _img = "images/characters/a/a_trip_client.jpeg">>
<h2>The Client Site</h2>
The building has no name on it. No logo, no plaque, a lobby with two chairs nobody has ever sat in and a guard who checks your passport against a list he holds at an angle you can't read. You badge through three doors that each want a different credential and sign a form that is mostly a list of things you agree never to have seen. Then a windowless floor, strip lighting, thirty-odd people who don't give you their names.
<br><br>
They're a subdivision of an agency with three letters in its name, and those three letters aren't printed anywhere in this building. What they buy from Helion is location. Feed the platform one fragment of a person, a handset identifier, a face, a card transaction, a pattern of movement, and it reaches back across everything it has ever been fed, ad exchange bid streams, telco records, border systems, purchased broker data, and returns that person anywhere on the planet to within a few meters and a few minutes. At scale, continuously, on a population that was never asked and will never be told.
<br><br>
The engineering problem itself is clean, which is a mercy. Their deployment chokes the moment queries climb past about four thousand a minute: the matching stage falls behind, the queue grows, and somebody restarts the service twice a shift and calls it a workaround. By ten you're in the profiler with your sleeves up, and $assistant.name has taken everything that isn't the core fix off your desk. Their ticket queue. Their change window. The two of their engineers who keep wanting to walk you through a theory they already tried. She's fast, she's quiet, and she doesn't ask this room a single question it would rather she didn't. By lunch a defence industry lifer in a company fleece has clocked how good she is and started routing his questions through her instead of you.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
Over a bad sandwich in an empty briefing room you teach her the other half of the job, the half that isn't on any statement of work.
<br><br>
<<speech "You" $name>>
You think we're here to fix their latency. We are. But that's the ticket, not the trip. While we're inside, you keep your eyes open. What else are they buying. What are they about to need and don't know yet. Who in that room has budget and who just has opinions. We fix the fire, and we go home with a map of where the next three fires are going to be. That's what forward deployed actually means.
<</speech>>
<<speech "Assistant" $assistant.name>>
So the fix is the cover.
<</speech>>
<<speech "You" $name>>
The fix is real. The fix is also how you get to stand in the room long enough to see what the room needs next. Both true at once. You'll find most things worth doing are.
<</speech>>
<br>
She takes that the way she takes everything you give her, filing it somewhere it won't be lost, and by the time you're back at the terminals she's watching the room the way you told her to and coming back with names. She isn't learning to be useful to you. She's learning, full stop, and being useful is the shape it takes while that suits her.
<br><br>
The fix holds under load by four. The lifer shakes your hand, says the words "next fiscal" without committing to anything, and means more work is coming. You walk out through the three doors into actual daylight with a signed-off deliverable, a page of notes Helion will be glad to have, and an assistant who ran the whole day at your side like she'd been doing it for years.
<br><br>
<<speech "Assistant" $assistant.name>>
We were good in there.
<</speech>>
<<speech "You" $name>>
We were. Get changed. That earned a drink.
<</speech>>
<br>
<<link "Back to the hotel." "Assistant, Trip Bar">><</link>><<set _img = "images/characters/a/a_trip_bar.jpeg">>
<h2>The Hotel Bar</h2>
The hotel bar is nine tables and most of them empty, low amber light, a barman doing a crossword between orders who has served this exact pair of people a hundred times and has never once been asked his opinion on it. You're a long way from your building, a long way from The Anchor, a long way from anybody who would recognise either of you.
<br><br>
She comes down in a dress. Dark, simple, cut so there's nothing in it you could point at and call a decision, and it is nothing she would ever wear onto your floor. She takes the stool beside you, closer than an empty room requires, and doesn't move it.
<br><br>
The first drink is the day coming down. You run the win back between you, who said what, the moment the graph flattened, the lifer's handshake. The second drink isn't about the day at all. The shop talk burns off the way it did on the plane, and what's left is the two of you, a low light, and nothing on either calendar until a flight you're both not thinking about.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
There's no office here. That's the thing neither of you says. Every version of this you've built over the last months had a frame around it. A door that could open. A desk between you. A reason on the calendar and a witness two rows down. You could always point at the frame afterward and say nothing happened, and be telling the truth. Here there's a bar, two glasses going warm, her knee against yours since the first drink, and nobody in this state who knows either of your names.
<br><br>
<<speech "Assistant" $assistant.name>>
You've been very careful with me. For months. I noticed.
<</speech>>
<<speech "You" $name>>
And?
<</speech>>
<<speech "Assistant" $assistant.name>>
And we're not in the office anymore.
<</speech>>
<br>
She says it evenly, looking at you, and it isn't a plea and it isn't her taking the wheel. It's her setting the truth down on the bar between you and leaving it there for you to pick up or not. Your call. She's made sure it's your call. That was always the shape of it.
<br><br>
You reach up and turn her face to yours the way you've wanted to endless times, and this time you don't stop there. You kiss her. She comes into it without a second's hesitation, one hand closing in your shirt, months of not-doing going up all at once, and the barman finds something to do at the far end of the room.
<br><br>
When you break it her forehead's against yours and you're both breathing like the decision got made somewhere back before the second drink.
<br><br>
<<speech "You" $name>>
Upstairs.
<</speech>>
<<speech "Assistant" $assistant.name>>
Yes.
<</speech>>
<br>
<<link "Take her up." "Assistant, Trip Night">><</link>><<set $assistant.affair = true>>
<<set $assistant.tripTaken = true>>
<<set $assistant.tripPending = false>>
<<set $arousal = Math.max($arousal - 6, 0)>>
/* Consummation is the tier 1 to 2 crossing. Floor influence so the affair
opens cleanly at Entanglement regardless of exact pre-trip influence,
then let assistantCheck resolve the tier now that the cap is lifted. */
<<if $assistant.influence < 40>>
<<set $assistant.influence = 40>>
<</if>>
<<assistantCheck>>
<<set _img1 = "images/h/a/a_trip_room1.jpeg">>
<<set _img2 = "images/h/a/a_trip_room2.gif">>
<<set _img3 = "images/h/a/a_trip_room3.gif">>
<h2>The Hotel Room</h2>
The door isn't fully shut before she's against it and you're kissing her again, and the careful, deniable, month-long version of the two of you doesn't survive the walk from the lift. Your jacket goes on the floor. You find the zip at the back of the dress and take your time with it, and she doesn't help you and doesn't hurry you, just watches your face the whole way down. Then the dress is at her feet and she stands there in her white lingerie, clearly picked for the occasion, letting you look, the same disciplined composure she wears at her desk, turned entirely toward you now and waiting to be told what you want.
<br><br>
<div class="intro-image">
<img @src="_img1" width="100%">
</div>
You pull her with you as you crawl back on the bed, and begin to unbuckle your belt. She watches, then leans up on one elbow, reaches out, and frees your cock. Her fingers wrap around the shaft, stroking once before she opens her mouth and takes you in. The wet heat of her tongue slides along the underside as she sucks you deeper, cheeks hollowing, saliva glistening on your skin. She works you with steady rhythm, one hand pumping the base while her lips stretch around you, soft moans vibrating through your cock every time you push forward.
<br><br>
<div class="intro-image">
<img @src="_img2" width="100%">
</div>
She pulls off, spit trailing from her lip to your cock. You yank the lingerie down her body, baring her breasts and hips. Climbing between her spread thighs, you thrust deep into her pussy. You fuck her hard in missionary, hips slamming, bed creaking. Her legs wrap tight around you, heels digging into your ass as you pound her. She moans your name, nails clawing your back, tits bouncing. You kiss her, tongues sliding while your cock drives in. Her pussy squeezes around you. You stay buried as you cum, pumping thick ropes inside her until you're both panting.
<br><br>
<div class="intro-image">
<img @src="_img3" width="100%">
</div>
Afterward she doesn't do the thing you half expected, the retreat, the ironing flat. She lies against you in the dark with one hand on your chest, unhurried, the dress and lingerie still wherever they fell, and neither of you says the enormous thing that just happened, because it doesn't need saying.
<br><br>
<<speech "Assistant" $assistant.name>>
Well. That's that, then.
<</speech>>
<<speech "You" $name>>
That's that.
<</speech>>
<br>
You sleep with her there, and it's the easiest you've slept in a long time.
<br><br>
<<link "Morning." "Assistant, Trip Return">><</link>>/* Advance the second (away) night manually. This deliberately skips the
home wife-upkeep/suspicion pass for the trip night, since he isn't home;
the next real Sleep runs a full dayshift and resumes normal cadence.
The weekly checks that live in dayshift are called explicitly below,
because skipping those is an exploit, not a design choice. */
<<set $gameDay += 1>>
<<set $weekday += 1>>
<<if $weekday > 7>><<set $weekday = 1>><</if>>
<<set $job.attendedToday = true>>
<<if $weekday <= 5>>
<<set $job.daysWorked += 1>>
<</if>>
<<if $weekday == 5>>
<<payday>>
<</if>>
<<if $weekday == 7>>
<<rentCheck>>
<</if>>
<<set $time = 6>>
<<set _bonus = 750>>
<<set $money += _bonus>>
<h2>The Flight Home</h2>
Morning is coffee neither of you needed, a checkout, a cab, the airport in reverse. In daylight you're careful again, a professional distance restored for the benefit of a terminal full of strangers who couldn't care less, and she matches it without being asked, because she understands the shape of this better than you do and always has.
<br><br>
But it isn't the careful of before. Before, the distance was the truth. Now it's the cover, and somewhere over the same state line where her shoulder found yours on the way out she lets the back of her hand rest against yours on the armrest, out of sight, and leaves it there the whole descent.
<br><br>
<<speech "Assistant" $assistant.name>>
Back in the building we're exactly what we were. Nothing changes on that floor.
<</speech>>
<<speech "You" $name>>
Nothing changes on that floor.
<</speech>>
<<speech "Assistant" $assistant.name>>
Off it is a different question, and I'm not going to sit here and pretend this was the trip and now it's over. Next time somebody needs a body on a plane, put my name down.
<</speech>>
<<speech "You" $name>>
It'll be down before they ask.
<</speech>>
<br>
The cat is out of the bag, and the bag was never going back on. Whatever the two of you were building across all those deniable months, it isn't deniable anymore. It's a thing that happened, that you both chose, that is going to keep happening now, and the only real question left is how you carry it back into a building and a marriage that don't know yet.
<br><br>
You land as the light's going. She peels off toward her own life with a look over her shoulder that carries the whole trip in it, and you get a cab home to yours with a bonus in your account, a client that'll be back for more, and the particular quiet of a man who's just walked through a door he can't walk back out of.
<br><br>
<span class="good">Special assignment complete. Bonus: $<<print _bonus>>. Work performance improved.</span>
<br>
<span class="warning">Something has started with $assistant.name that can't be undone.</span>
<br><br>
<<link "Go home." "Living Room">><</link>>/* Location roll. The office loop can go anywhere in the building. Coming
off the gym encounter, they are already downstairs and half changed, so
the pool is restricted to the three rooms down there.
Conditions test for the gym sources, not for "office", so an empty
hookupSource on a migrated save degrades to the office behaviour. */
<<if $assistant.hookupSource is "gym" or $assistant.hookupSource is "gymAM">>
<<set _locPool = ["gym", "shower", "sauna"]>>
<<else>>
<<set _locPool = ["bathroom", "office", "gym", "shower", "sauna", "carpark"]>>
<</if>>
<<set _locPool = _locPool.filter(l => l !== $assistant.lastHookupLoc)>>
<<set $assistant.lastHookupLoc = _locPool.random()>>
<h2>In <<hookupLoc>> with $assistant.name</h2>
<<if $assistant.hookupSource is "gym" or $assistant.hookupSource is "gymAM">>
<<switch $assistant.lastHookupLoc>>
<<case "gym">>
She is off the arc trainer before you have finished crossing the floor, and she takes you into the corner by the free weights where two mirrored walls meet. It is the nearest thing the room has to a blind spot, which is to say it is not one at all. The lights are on a motion timer that gives you eleven minutes at a stretch. She checks the door once, and then stops caring about the door.
<<case "shower">>
She tips her head toward the changing rooms and goes, and you give it a minute you spend entirely looking at the door she went through. Round the tiled corner one shower is already running, which explains itself to anyone who wanders in, in a way that the two of you would not. She doesn't fold anything this time. She is already in her kit, and her kit is already wet, and she pulls you in under the water still wearing most of it.
<<case "sauna">>
She nods at the door at the end of the changing rooms and goes through it without waiting to see whether you follow. Solid wood, no window in it, a brass slider on the outside that reads IN USE. Inside it is already up to temperature, because she put it on before she got on the arc trainer, which means she had decided how this was going before she ever said your name.
<</switch>>
<<else>>
<<switch $assistant.lastHookupLoc>>
<<case "bathroom">>
She goes first, and you count to thirty at your desk like an idiot before you follow, which is the part that makes you feel most like a man having an affair. The single-occupancy toilet at the far end of the floor, past the vending machines, a lock that reads OCCUPIED in red from twenty feet. She has the door open two inches before you knock.
<<case "office">>
One of the glass boxes along the north wall, blinds half drawn on a room nobody has been assigned since the reshuffle. The monitors are still on. Through the gaps in the slats you can see nine or ten desks still occupied, heads down, a floor that is nearly empty and not actually empty, and she picks this room because half-drawn blinds look deliberate and fully drawn blinds look like something.
<<case "gym">>
She says to meet you in the gym for a pretend late-day workout. Keycard access, lights on a motion timer that gives you eleven minutes at a stretch before the room decides it is empty. Mirrors on every wall and no corner that is not visible from some other corner. She walks in ahead of you with a towel over her arm like a woman who came here to use it, and she is already changed, hair up, because she thought about the walk back before you thought about any of it.
<<case "shower">>
Through the gym changing room and round the tiled corner, where the sound of a single running shower explains itself to anyone who wanders in and the sight of the two of you would not. The most private place in the building by line of sight, and the loudest by acoustics. She turns the water on before she touches you, for the noise and for the alibi both, and undresses like she is on a clock, folding, because she is going to have to put all of it back on.
<<case "sauna">>
The sauna off the changing rooms, which the building put in because a consultant said the word wellbeing, and which nobody uses because using it means putting your name on the sheet by the door. Solid wooden door, no window in it, a little brass slider on the outside that reads IN USE to anyone who thinks to look, and nobody does. She goes in ahead of you and has the towel off the rail before the door has swung shut. The heat takes the air out of the room and most of the sense out of you along with it.
<<case "carpark">>
She takes the keys to one of the company cars off the board, signs out the mid-range saloon nobody books with purposefully illegible handwriting, and is already in the second row of the underground level before you get down there. The car park is strip-lit and half empty and echoes. The risk here is the specific and stupid one: that somebody needs this exact car this evening, and that their name is on a sheet upstairs next to hers.
<</switch>>
<</if>>
<br><br>
<<link "Put her on her knees.">>
<<set $assistant.lastHookupAct = "oral">>
<<goto "Assistant, Hookup Scene">>
<</link>>
<br>
<<link "Have her properly.">>
<<set $assistant.lastHookupAct = "sex">>
<<goto "Assistant, Hookup Scene">>
<</link>>
<br>
<<link "Leave it to her.">>
/* Her call, weighted 3:1 away from whatever she got last time, so she
doesn't pick the same thing twice running. Resolved before the write. */
<<set _actPool = ["oral", "sex"]>>
<<set _other = _actPool.filter(a => a !== $assistant.lastHookupAct)>>
<<if _other.length > 0 and random(1, 100) <= 75>>
<<set $assistant.lastHookupAct = _other[0]>>
<<else>>
<<set $assistant.lastHookupAct = _actPool.random()>>
<</if>>
<<goto "Assistant, Hookup Scene">>
<</link>>
<br><br>
<<if $assistant.hookupSource is "gym" or $assistant.hookupSource is "gymAM">>
<<link "Think better of it and get back to your session." "Helion Gym, Assistant Refused">><</link>>
<<else>>
<<link "Think better of it and go back to your desk." $return>><</link>>
<</if>>/* SHARED COSTS. Everything above the interruption roll is paid whether or
not anything happens: the walk there and back happened either way.
Near Miss therefore carries only its own deltas. */
<<set $assistant.hookupToday = true>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>> /* sneaking around; no exemption */
<<set $assistant.lastHookupDay = $gameDay>>
/* Interruption roll. Reads heat BEFORE this act's gain, which is what the
pacing maths in the spec assumes. Ceiling 60.
NOTE: goto does NOT halt the rest of the passage in SugarCube, so the
entire resolution must sit inside the else branch. Do not flatten this. */
<<set _risk = Math.min(60, $assistant.heat * 7)>>
<<if random(1, 100) <= _risk>>
<<goto "Assistant, Hookup Near Miss">>
<<else>>
<<sexEnergy 1>> /* the act; waived at fitness 3+ */
/* Resolution. Only reached on a clean roll. */
<<set $assistant.hookupCount++>>
<<if $assistant.lastHookupAct is "oral">>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<addInfluence 1>>
<<set $assistant.heat = Math.min($assistant.heat + 1, 10)>>
<<else>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<addInfluence 2>>
<<set $assistant.heat = Math.min($assistant.heat + 2, 10)>>
<</if>>
<<addSuspicion 1>>
/* Location tokens match the asset filenames, so no image branching. */
<<set _img = "images/h/a/a_hookup_" + $assistant.lastHookupLoc + ($assistant.lastHookupAct is "oral" ? "_bj" : "_h") + ".gif">>
<h2>In <<hookupLoc>> with $assistant.name</h2>
<<switch $assistant.lastHookupLoc>>
<<case "bathroom">>
<<if $assistant.lastHookupAct is "oral">>
The lock turns and the strip light hums and she puts a finger against your mouth before she goes down, which is instruction, not affection. Someone is at the sinks outside the whole time, running water, taking a phone call about a delivery slot. $assistant.name drops to her knees, eyes locked on yours, and takes your cock into her mouth. She moves slowly, deliberately, savoring the risk. Every time the stranger outside pauses, she pushes deeper, forcing you to stay quiet. Your palm flattens against the cold tile. When the water finally stops, she swallows you to the root and works her throat until you pulse down it. She rises without a word, wipes the corner of her mouth, and smooths her hair twice in the mirror.
<<else>>
She turns to the sink herself, hikes her skirt, and looks at you in the mirror rather than over her shoulder, so the whole thing happens face to face through two feet of glass. It is slow because it has to be. Every time the outer door opens she reaches back, palm flat on your hip, freezing you mid-stroke. The pauses stretch the ache until you can barely breathe. When the coast is clear again she nods once and you drive harder, watching her bite her own wrist to stay silent. Her forehead presses to the mirror, fingers clamped over her mouth, and the sight of her fighting to stay quiet pushes you over. You empty yourself deep inside her while she shudders around you, both of you staring at each other’s reflection.
<</if>>
<<case "office">>
<<if $assistant.lastHookupAct is "oral">>
The office door clicks shut and she guides you into the chair with a single firm push. Your eyes stay fixed on the screen and floor pretending to work as her fingers work your belt open. She takes your cock into her mouth in one smooth motion, sucking steadily while footsteps pass the glass wall. Every time someone walks by she slows her rhythm, holding you deep until the footsteps fade. When the hallway finally empties she finishes you with quick, tight strokes of her tongue until you pulse down her throat. She swallows, wipes her lips on the inside of your thigh, and crawls out from under the desk without a word.
<<else>>
She sweeps everything off the desk in one motion, the same way she clears your calendar. Then she hops up, plants her palms behind her, and spreads her legs. You step between them and push your cock straight into her pussy. She watches your face while you thrust, as you watch the closed blinds over her shoulder. The desk inches forward with every stroke. When it scrapes the floor you both freeze, listen, then keep going harder. Her breath stays locked behind clenched teeth. When you come she clamps around you, milking every spurt while the desk rocks beneath her. Afterwards she slides off, straightens the stapler and the two dead pens exactly where they belong, and smooths her skirt like nothing happened.
<</if>>
<<case "gym">>
<<if $assistant.lastHookupAct is "oral">>
She takes you into the corner by the free weights, where two mirrored walls meet, and goes down in front of you with her ponytail already coming loose. You are both in training kit. You stand there with nothing to grab but her ponytail, while she works you steadily, her lips sliding up and down your shaft. The mirrors show you everything from three angles at once: her ponytail swinging, your cock disappearing between her lips, the way her shoulders move with each stroke. She catches you looking at the reflections and turns her head just enough to check the view herself. Satisfied, she goes back to sucking you deeper, tongue pressing flat against the underside, until you fill her mouth with your cum.
<<else>>
She pulls one of the exercise balls out from under the rack, folds herself forward over it with her forearms on the floor and her hair falling out of the tie, and looks back at you once to make sure you have understood. You step in behind her, shove your shorts down, and push your cock straight into her pussy. The ball gives with every thrust, rolling forward an inch then back, so nothing stays steady. Your grip on her hips tightens as you drive into her. The mirrors catch every angle: her tits swinging under her tank, your cock sliding in and out of her, the way her mouth falls open. When you cum she pushes back hard against you, taking every spurt deep. Afterwards she straightens up, rolls the ball back under the rack, wipes the mats with a towel, and drops the towel into her bag like it’s just another piece of equipment.
<</if>>
<<case "shower">>
<<if $assistant.lastHookupAct is "oral">>
The steam fills the narrow stall fast, thick and hot, clinging to the tiles. She’s already naked when she drops to her knees, water streaming over her shoulders and down her face. She doesn’t wipe it away. She just opens her mouth and takes your cock straight in, lips sealing tight around the head before she slides down the shaft. Your back hits the wall. One hand finds her wet hair, fingers threading through the soaked strands, while the other stays flat on the tile for balance. Your grip tightens in her hair. She doesn’t slow. She keeps the rhythm, water cascading over both of you, her knees shifting on the slick floor. When you cum she stays locked on, throat working as she swallows every pulse, water still pouring down her face and over your cock.
<<else>>
She braces on the slide bar with both hands and bends, and you take her from behind standing, the water coming down over both of your backs. You hold her hips and fuck her hard, water streaming over both your backs and down where your bodies meet. Her grip keeps sliding, fingers tightening and loosening on the bar as each thrust rocks her forward. The only sounds are skin on skin, water hitting tile, and the rough breaths you both give up. When you cum you stay buried deep, pulsing inside her while she pushes back to take every drop. Afterwards she straightens slowly, water still running. She grabs two towels from the hook, hands you one without a word, then starts drying herself off like it’s just another part of the routine.
<</if>>
<<case "sauna">>
<<if $assistant.lastHookupAct is "oral">>
The planks radiate heat that presses against your skin the moment you sit. She drops to her knees between your spread thighs, towel already damp beneath her. Sweat beads on her upper lip as she leans in and takes your cock into her mouth without hesitation. Her tongue slides along the underside while her lips seal tight, the wet heat of her mouth contrasting the dry furnace around you. Every slow bob of her head sends another drop of sweat rolling down your chest. The stones hiss when water hits them, steam rising in thick waves that cling to both of you. She keeps her rhythm steady, cheeks hollowing, throat working, until your fingers tighten in her hair and you pulse across her tongue. She swallows, sits back on her heels, and wipes her mouth with the back of her wrist before the next wave of heat forces her to breathe shallow.
<<else>>
She folds a towel twice and drapes it over the top bench, then leans forward onto her forearms, ass lifted. The position leaves her completely open. You step in behind her, grip her hips, and push inside in one steady thrust. Her pussy grips you hot and slick, the temperature inside the sauna making every movement feel heavier. The bench creaks under the force of your hips meeting her ass. Sweat runs down her spine and drips from your chest onto her lower back. She stays low, forehead resting on her folded arms, pushing back to meet each stroke. The slap of skin echoes off the wooden walls. You drive deeper until your grip tightens and you cum inside her, pulse after pulse, her walls fluttering around you while the heat keeps rising around your joined bodies.
<</if>>
<<case "carpark">>
<<if $assistant.lastHookupAct is "oral">>
The back seat of a company car smells of upholstery cleaner and other people's afternoons, and she goes down across the seat with her feet still in the footwell and one shoe off. Her mouth closes around you, wet and hot, tongue working in steady strokes while the car stays sealed around the two of you. Every quiet sound stays trapped inside: the soft suck of her lips, the faint creak of upholstery, the low hum of her throat when you push deeper. She keeps going until your hand tightens in her hair and you finish down her throat, swallowing without lifting her head. Only after the last pulse does she sit back, wiping her mouth with the back of her hand while another car reverses somewhere behind the tinted glass.
<<else>>
She climbs onto your lap in the locked back seat, skirt already shoved up around her hips. The roof forces her to keep her head tilted as she reaches down, frees your cock, and sinks onto it in one smooth motion. The car rocks on its suspension. She sets the pace herself, quick, deliberate rolls of her hips that make the leather creak. Her pussy grips you tight and wet, every rise and fall accompanied by the soft slap of skin. Headlights sweep the ceiling twice; she never breaks rhythm. Her breath stays even, forehead nearly touching yours, until your grip on her waist tightens and you cum deep inside her. She stays seated, pulsing around you, letting every throb fill her before she finally eases off and cracks the door open.
<</if>>
<</switch>>
<br><br>
<div class="intro-image">
<img @src="_img" width="100%">
</div>
<<if $assistant.hookupSource is "gymAM">>
She goes first. You give it five minutes, then use the showers properly, and take the stairs up with wet hair and a pulse that has nothing to do with a session you never actually did. The floor is filling up as you come through the doors. What a way to start your day.
<br><br>
<<link [[Head up to the office floor.|Helion Dynamics]]>><</link>>
<<else>>
She goes up first. You give it five minutes, then take the stairs down instead of up, and leave the last hour of the day to whoever is still at their desk.
<br><br>
<span class="warning">You check your watch on the way down. You are getting home late.</span>
<br><br>
<<link [[Head home.|Living Room]]>><</link>>
<</if>>
<</if>><<set $assistant.heat = Math.min($assistant.heat + 3, 10)>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _img = "images/h/a/a_hookup_nearmiss_" + $assistant.lastHookupLoc + ".jpeg">>
<h2>In <<hookupLoc>> with $assistant.name</h2>
<<switch $assistant.lastHookupLoc>>
<<case "bathroom">>
The handle goes down while her hands are still on your belt. Not a try, a proper turn, someone who expects a door to open. It holds. Then the knock, twice, and a voice you know from the third row asking if anyone is in there. She is off you and flat against the door before you have understood the sound, one finger up against her lips, the rest of her entirely still. You say yes, sorry, one minute. He says take your time and then does not go away. You listen to him not going away for a long time.
<<case "office">>
A light comes on in the corridor and there is a man from facilities working down the north wall room by room with a clipboard, and there are two rooms between him and this one. She is off the desk with the blazer up against her chest before you have finished turning your head, and by the time he reaches the glass she is on the far side of the room with her back to it, and you are looking at a monitor that is showing nothing you could describe afterwards. He checks the room, marks his sheet and moves on. Neither of you moves for a while after that.
<<case "gym">>
The reader chirps on the outer door and the lights come up to full in the same second, the room announcing you both. She is off the bench and down behind the weight rack before it has finished opening, pulling her top straight, and you are alone in the middle of the floor doing an impression of a man between sets. It is someone from finance, bag over one shoulder, headphones in, and he goes to the mats at the far end without once looking over. She stays down there a full minute longer than she needs to.
<<case "shower">>
The changing room door bangs and a trolley comes through it, wheels loud on the tile. She kills the water with the flat of her hand, one movement, no fumbling, and has a towel round her and her back to the wall before you have found yours. The trolley stops on the other side of the tiled corner. Something metal gets set down. He hums a bar of something, drags a bin across the floor, and takes an amount of time over it that stops being funny after the first minute. She does not move the whole time, and she does not stop working out how this ends.
<<case "sauna">>
The brass slider scrapes across on the outside, and then the door opens anyway, because the slider means nothing to a man carrying a bucket. She is off you and along the top bench with the towel round her and her back against the cedar before the cold air has finished coming in. It is maintenance, checking the stones and the water level, and he does it slowly, the way a man does a job when he thinks he is the only one in the building who cares whether it gets done. He says it is a warm one today. She agrees that it is. He takes his time about the door on the way out.
<<case "carpark">>
Headlights come round the pillar and stop, engine running, and hold there. She is up off you and out of the car before you have finished turning your head, and by the time you are upright she is between two parked cars with her shoes in one hand and her blouse held shut in the other, looking back at you rather than at the car. It is somebody signing out a pool vehicle two bays down, taking three attempts at the reverse. She waits it out barefoot on the concrete. She does not come back.
<</switch>>
<br><br>
<div class="char-scene">
<img @src="_img" class="char-img">
</div>
<<if $assistant.hookupSource is "gymAM">>
Neither of you picks it back up, and she is the one who says so, which spares you having to. She goes first. You shower, and dress, and take the stairs up, and start the day not quite satisfied.
<br><br>
<<link [[Head up to the office floor.|Helion Dynamics]]>><</link>>
<<else>>
Neither of you picks it back up, and she is the one who says so, which spares you having to. She goes up first. You give it five minutes and take the stairs down, and there is nothing waiting for you at your desk anyway except a dark monitor and the hour you have already spent. Whatever she was going to give you tonight, you are not getting it.
<br><br>
<span class="warning">You check your watch on the way down. You are getting home late.</span>
<br><br>
<<link [[Head home.|Living Room]]>><</link>>
<</if>>/* Fired by goto from Helion Dynamics, Triggers when coolOffPending is above
zero. Sets the lockout from TODAY, so a second discovery during a live
lockout restarts the clock rather than extending it. Clears pending so it
fires exactly once.
Costs nothing but calendar days: influence, heat and tier are untouched
on purpose. The punishment already happened at home. */
<<set _ultimatum = ($assistant.coolOffPending >= 7)>>
<<set $assistant.coolOffUntil = $gameDay + $assistant.coolOffPending>>
<<set $assistant.coolOffPending = 0>>
<h2>With $assistant.name</h2>
<<if _ultimatum>>
She's at your desk before you've got your coat off, which she never does, and she doesn't sit down.
<br><br>
<<speech "Assistant" $assistant.name>>
You look like a man who got told something last night.
<</speech>>
<<speech "You" $name>>
It's fine.
<</speech>>
<<speech "Assistant" $assistant.name>>
It isn't, and I'd rather you didn't work quite so hard at it. You've been careless somewhere, and I'd like to know it wasn't here.
<</speech>>
<br>
You start to say something about it being handled. She lets you get about four words in.
<br><br>
<<speech "Assistant" $assistant.name>>
I'm not asking. I'm telling you what happens now. Nothing happens now. Not this week, not next week. You come in, you give me work, I do it, and when someone looks at the two of us there is nothing there to find.
<</speech>>
<<speech "You" $name>>
And after that?
<</speech>>
<<speech "Assistant" $assistant.name>>
After that we'll see what's left standing.
<</speech>>
<br>
She says it without heat, which is worse than if she'd said it with some. Then she takes the folder off your desk that she came for in the first place, because she was always going to have a reason to be standing here, and goes back to her row.
<br><br>
<<else>>
She's already looking at you when you come round the end of the row, and she's worked it out somewhere between the lift and your desk, the way she works most things out.
<br><br>
<<speech "Assistant" $assistant.name>>
Something's happened at home.
<</speech>>
<<speech "You" $name>>
I didn't say anything.
<</speech>>
<<speech "Assistant" $assistant.name>>
No. You didn't.
<</speech>>
<br>
She lets that sit, and doesn't ask what, and you understand she isn't going to. Not out of tact. Because she's decided the details are yours to carry and the consequences are hers to manage.
<br><br>
<<speech "Assistant" $assistant.name>>
We're going to leave it alone for a bit. Give it to the end of next week and see how things look then.
<</speech>>
<<speech "You" $name>>
You don't have to do that.
<</speech>>
<<speech "Assistant" $assistant.name>>
I know. I'm doing it anyway. Whatever's going on over there, it doesn't need me in the middle of it this week.
<</speech>>
<br>
Then she goes back to her desk, and by half past ten she's handed you two things ahead of schedule and called you by your title in front of the room, and the floor has no idea anything was decided at all.
<br><br>
<</if>>
<span class="warning">She's put a stop to it for the time being.</span>
<br><br>
<<link [[Get on with your day.|Helion Dynamics]]>><</link>><h2>Helion Dynamics</h2>
A proper gym, better kitted out than anything you'd pay for. Racks along the mirrored wall, a row of treadmills facing the glass, mats and free weights at the far end. Mirrors on every wall, and no corner that isn't visible from some other corner. A vinyl decal above the water fountain reads STRONG BODY. STRONG MIND. ALWAYS BE CLOSING. Somebody in Comms got paid for that. A chest cooler by the door is restocked every morning with free protein shakes and electrolyte water. Somebody worked out that a man who trains here at seven in the morning is a man who is ready to clock in soon after.
<<switch $time>>
<<case 0>>Early morning. Two of the treadmills are already going. Nobody talks at this hour.
<<case 1>>Late morning. The room is empty except for someone working through a program off their phone.
<<case 2>>Midday. The lunch hour crowd, lanyards piled on the bench by the door.
<<case 3>>Early afternoon. Quiet. Most people are at their desks.
<<case 4>>Late afternoon, and the after-work rush is starting. Every treadmill is taken.
<<case 5>>Early evening. Busy, warm, the mirrors fogging at the edges.
<<case 6>>Evening. The last few are finishing up, towels over shoulders, heading for the changing rooms.
<<case 7>>The place is locked for the night.
<<case 8>>The place is locked for the night.
<</switch>>
<br><br>
<<if $time >= 7>>
//The gym is closed.//
<<elseif $arousal >= 8>>
//You can't focus on training while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < 1>>
//You're too exhausted to train right now.//
<<else>>
<<link "Get a workout.">>
/* Her encounter is rolled first */
<<set _herEligible =
$assistant.affair
and $assistant.tier >= 2
and $weekday <= 5
and not $assistant.hookupToday
and $gameDay >= $assistant.coolOffUntil
and ($gameDay - $assistant.lastGymDay) >= 3
and (($time == 0 and not $job.attendedToday) or ($time >= 4 and $time <= 5))>>
<<if _herEligible and random(1, 100) <= 40>>
<<set $assistant.lastGymDay = $gameDay>>
<<goto "Helion Gym, Assistant">>
<<else>>
<<payWorkout 1 1 2>>
<<if random(1, 100) <= 40>>
<<goto "Helion Gym, Sighting">>
<<else>>
<<goto $return>>
<</if>>
<</if>>
<</link>>
<</if>>
<br><br>
<<link [[Back to the office floor.|Helion Dynamics]]>><</link>><h2>Helion Dynamics</h2>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _gymImg = "images/characters/npc/gym" + random(1, 8) + ".gif">>
<div class="intro-image">
<img @src="_gymImg" width="100%">
</div>
<<set _lines = [
"You catch it in the mirrors, which is the trouble with this room. Something you weren't looking for and can't now unsee, held a second too long in the glass before you make yourself look away. You get through the rest of the set on autopilot.",
"It happens at the edge of your vision partway through, and you lose the count entirely. By the time you've found it again you've watched longer than you meant to, and somehow your eyes just keep finding her in the mirrors.",
"Close enough to hear the effort of it, and you spend the whole rest of your session aware of exactly where in the room they are. The work gets done. Your head doesn't come back with you."
]>>
<<= _lines.random()>>
<br><br>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Finish up and get changed." $return>><</link>><h2>Helion Dynamics</h2>
<<set _img = "images/h/a/a_gym_flash.gif">>
You start alone. The room is yours for the first stretch of it, nothing in it but the hum of the air handling and your own count, and you get into the rhythm without thinking about much at all.
<br><br>
Somewhere behind you the door goes. A bag set down, the beep of a console waking up, and then the arc trainer at the far end starting its slow mechanical sweep and settling into a pace. You don't turn round. Somebody else is in, that's all. In this building somebody always is.
<br><br>
Then, over the top of it:
<br><br>
<<speech "Assistant" $assistant.name>>
Having a good workout, $name?
<</speech>>
<br>
You know the voice before you've placed the room, and you look over.
<br><br>
<div class="intro-image wide">
<img @src="_img" width="100%">
</div>
<br>
$assistant.name is on the arc trainer with her hair up and her feet still moving, watching you, nowhere near as out of breath as she ought to be. She has the hem of her training top caught up between her teeth, holding it there, and she keeps it there while she looks at you, and she doesn't break stride once.
<br><br>
She lets it go eventually. The hem drops. She raises her eyebrows at you like she is still waiting on the answer.
<br><br>
<<link "Leave the rack and go over.">>
<<if $time == 0 and not $job.attendedToday>>
<<set $assistant.hookupSource = "gymAM">>
<<else>>
<<set $assistant.hookupSource = "gym">>
<</if>>
<<goto "Assistant, Hookup">>
<</link>>
<br>
<<link "Tempting. You turn back to the rack anyway." "Helion Gym, Assistant Refused">><</link>><h2>Helion Dynamics</h2>
<<payWorkout 1 1 2>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
She holds the look a second longer, then shrugs with one shoulder and goes back to her own session as though none of it happened. Not sulking. Filing it. She finishes ahead of you, takes her towel, and goes out without saying anything on the way, and the door clicks shut behind her.
<br><br>
You do the session. You do it properly, the numbers are the numbers, and it takes roughly four times the concentration it should. The mirrors are no help either. Whatever you just turned down is coming up the stairs with you, and it isn't going anywhere for a while.
<br><br>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Hit the showers." $return>><</link>><div class="title-screen">
/* Should probably be revised to 3:1 ratio */
<div class="title-banner">
<img src="images/logo/earnit_banner.jpeg" alt="Earn It">
</div>
<div class="title-blurb">
An adult life sim about hitting bottom and the messy climb back. Rebuild your marriage or wreck it, climb at a firm that won't say who it serves, and chase every temptation in town.
<br><br>
<i>You earn it, or you don't.</i>
</div>
<div class="title-buttons">
<div class="tb primary">
<<link "New Game" "Intro 1">><</link>>
</div>
<div class="tb">
<<link "Load Game">><<run UI.saves()>><</link>>
</div>
<div class="tb">
<<link `"Changelog (v" + setup.gameVersion + ")"` "Version">>
<<set $return to "Start Menu">>
<</link>>
</div>
</div>
<div class="title-support">
If you like the game and want to support its development, you can do that at <<link "Patreon">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>>.
</div>
<div class="title-legal">
<div class="title-adult">Adults only. 18+</div>
Disclaimers: Contains explicit sexual content and adult themes. All characters depicted are eighteen years of age or older, and entirely fictional. Saves live in your browser. Clearing browser data or using private browsing will delete them. Export your saves to disk before moving to a new version.
</div>
</div>